2017-10-11 1 views
3

나는 이해할 수없는 상황에 처하게되었다. (실행 가능한)파이썬에서 전역 변수 가져 오기 두 가지 방법으로

one.py : 나는 세 개의 파일이

import two 
import three 

three.init() 
two.show() 

two.py :

import three 

def show(): 
    print(three.test) 

three.py :

결과가 1
test = 0 

def init(): 
    global test 
    test = 1 

, 내가 예상했던대로. 이제 two.py를 수정 해 보겠습니다.

from three import test 

def show(): 
    print(test) 

결과는 0입니다. 왜 그렇습니까?

+1

를이 때문에'의 세 수입 test'의 .. 두 번째 two.py에서는 'test'만 가져오고, 이는 three.py에서'0'과 같습니다. –

+3

긴 이야기를 짧게하기 위해서 : 두번째 경우'test'는'two.py'에 국한되어 있으므로'three.test'를 리 바인딩하면'two.test'에 영향을 미치지 않습니다 (두 개의 다른 이름입니다). 자세한 내용은 다음을 참조하십시오. https://nedbatchelder.com/text/names.html –

답변

1

이것은 모두 범위에 관한 것입니다. 다음과 같이 one.py를 변경하면 더 잘 볼 수 있습니다.

import three 
from three import test 

three.init() 

print(test) 
print(three.test) 

이 인쇄됩니다 :

0  <== test was imported before init() 
1  <== three.test fetches the current value 

만 변수를 가져 오는 경우가 불변의 정수 로컬 변수를 생성합니다.

그러나 당신은 당신이 다른 결과를 얻을 것입니다 다음과 같이 import 문의 순서를 변경하는 경우 :

import three 

three.init() 
print(three.test) 

from three import test 
print(test) 

가 인쇄됩니다

1  <== three.test fetches the current value 
1  <== test was imported after init() 
+1

"변수 만 가져 오면 변수가 다르게 컴파일됩니다." => 이것은 컴파일과 전혀 관련이 없습니다.이 모든 것은 런타임에 발생합니다. –

+0

귀하의 의견을 보내 주셔서 감사합니다, 그 진술을 수정했습니다. – scriptmonster

관련 문제