요약 : 전역 변수, 모듈 스코프 변수 보다는 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 규칙을 정하거나. (이런 특정한 규칙은 팀 멤버들이 모두 공유해야 한다는 번거로움이 생긴다.)