2017-10-11 11 views
3

私は理解できない状況に遭遇しました。Pythonでグローバル変数を2つの方法でインポートする

one.py(実行可能):

import two 
import three 

three.init() 
two.show() 

two.py:

import three 

def show(): 
    print(three.test) 

three.py:

test = 0 

def init(): 
    global test 
    test = 1 

結果は1ですが、私は3つのファイルを持っています私の期待通りに。今度はtwo.pyを修正しましょう:

from three import test 

def show(): 
    print(test) 

結果は0です。なぜですか?

+1

を、このため 'から3輸入test'の.. 2回目のtwo.pyでは、 'test'のみをインポートします。これはthree.pyで' 0'と同じです。 –

+3

長いストーリーを短くするには、2番目のケースでは 'test'が' two.py'のローカルになりますので、 'three.test'を再バインドしても' two.test'に影響しません(これらは2つの異なる名前です)。詳細な説明は、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

関連する問題