(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.