Post

(python) 헷갈리는 모듈 스코프 변수, 전역 변수처럼 쓸 수 있을까? - 아니. class level 변수를 쓰자.

요약 : 전역 변수, 모듈 스코프 변수 보다는 class level 변수를 사용하자.

main.py

1
2
3
4
5
6
7
8
9
10
**from g\_val import \*** 

print("1 ", a)
print(id(a))
a = False
delay()
print("3 ", a)
print(id(a))

g_val.py

1
2
3
4
5
6
import time
a = True
def delay():
print("2 ", a)
print(id(a))

1
2
3
4
5
6
7
8
λ python main.py
1  main  True
140734249552208
2  g\_val True    # False로 변경되어야 할 것 같지만, 그렇지 않다.
140734249552208
3  main  False
140734249552240

처음에는 main.py에서 a라는 변수에 접근할 때는, g_val에서 불러온 변수 그대로다.

그러나 main.py에서 a = 어쩌구로 할당 하는 순간새로운 변수가 잡혀버린다.

때문에 main.py에서 a = False로 변경한 값이 반영되지 않았다.

* 객체나 배열이라면 이런식으로 할당할일이 없으므로 재할당하면서 새로운 변수가 잡히는 케이스가 드물기는 하다.

그러나 import를 다음과 같이 하면…

main.py

1
2
3
4
5
6
7
8
9
**import g\_val as g** 

print("1 ", g.a)
print(id(g.a))
g.a = False
g.delay()
print("3 ", g.a)

1
2
3
4
5
6
7
8
λ python main.py
1  main  True
140734249552240
2  g\_val False
140734249552240
3  main  False
140734249552240

이렇게 하면 a라는 변수에 새로운 값을 대입하더라도 a가 새로 할당되는 것이 아니고, a라는 변수가 각 모듈 간 공유된다.

global a를 적어주어도 차이가 없다. 위와 같은 결과다.

그래서 파이썬에서 모듈 간 공유해야 하는 변수가 있다면, 모듈 스코프 변수나 전역 변수를 사용하기 보다는 class 레벨에서 class variable로 선언하는 것이 좋아 보인다.

아니면 import g_val as g 처럼 특정한 import 규칙을 정하거나. (이런 특정한 규칙은 팀 멤버들이 모두 공유해야 한다는 번거로움이 생긴다.)

This post is licensed under CC BY 4.0 by the author.