[python] 헷갈리는 모듈 스코프 변수, 전역 변수처럼 쓸 수 있을까? - 아니. class level 변수를 쓰자.
요약 : 전역 변수, 모듈 스코프 변수 보다는 class level 변수를 사용하자.
main.py
```python
from g_val import *
print("1 ", a)
print(id(a))
a = False
delay()
print("3 ", a)
print(id(a))
```
g_val.py
```python
import time
a = True
def delay():
print("2 ", a)
print(id(a))
```
```python
λ 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
```python
import g_val as g
print("1 ", g.a)
print(id(g.a))
g.a = False
g.delay()
print("3 ", g.a)
```
```python
λ python main.py
1 main True
140734249552240
2 g_val False
140734249552240
3 main False
140734249552240
```
이렇게 하면 a라는 변수에 새로운 값을 대입하더라도 a가 새로 할당되는 것이 아니고, a라는 변수가 각 모듈 간 공유된다.
``py global a``를 적어주어도 차이가 없다. 위와 같은 결과다.
그래서 파이썬에서 모듈 간 공유해야 하는 변수가 있다면, 모듈 스코프 변수나 전역 변수를 사용하기 보다는
class 레벨에서 class variable로 선언하는 것이 좋아 보인다.
아니면 import g_val as g 처럼 특정한 import 규칙을 정하거나. (이런 특정한 규칙은 팀 멤버들이 모두 공유해야 한다는 번거로움이 생긴다.)
'Languages & Frameworks > Python' 카테고리의 다른 글
[Python] 파이썬 버전, 패키지 관리 (0) | 2020.10.10 |
---|---|
[python] 사용하면 좋은 패턴들 (0) | 2019.02.11 |
[python] pdb : 디버깅 (0) | 2018.11.12 |
[python] 성능 측정, 프로파일링(profiling) (0) | 2018.11.12 |
[python] socket (0) | 2018.11.10 |