2016-09-19 5 views
0

Python 2.7を使用しています。グローバル変数countertestlib.pyからuselib.pyにインポートしようとしましたが、返される結果は0プログラムのuselib.pyにあります。なぜ2は返されませんか?ありがとう。Python 2.7グローバル変数の問題

testlib.py

counter = 0 

class Foo: 
    def __init__(self): 
     pass 
    def Count(self): 
     global counter 
     counter += 1 

uselib.py、Pythonのドキュメント毎

from testlib import Foo 
from testlib import counter 


f = Foo() 
f.Count() 

g = Foo() 
g.Count() 

print counter # output is 0 other than 2 
+2

私はそれが現在のスコープにコピーをインポート推測しているので、それが正しい 'counter' – Li357

+0

@AndrewLを修正しない、あなたは何をすべきか。コピーをインポートする意味ですか? –

+0

Related Post http://stackoverflow.com/questions/15959534/python-visibility-of-global-variables-in-imported-modules –

答えて

1

:import文は、2つの操作を組み合わせた

。名前付きモジュールを検索し、その検索結果をローカルスコープ内の名前にバインドします。

だから、それは、counterインポートは、変更が右counterには起きていないという意味、現在のスコープにインポートラベルを持つだけコピーであることを意味します。あなたがcounterをインポートすると

、Pythonは、モジュールを見つけ、それをuselibに、その後コピーtestlibからcounterを取ります。 Countへの呼び出しがあるので、そのコピーは変更されませんtestlibの変数をインポートしてローカルスコープに追加したコピーではなく、その変数を変更します。これは、あなたがcounterの初期状態を印刷し、それが正しく印刷するには0を印刷し、修正されていない決して意味し、使用:

print testlib.counter 
+0

Andrewさん、ありがとうございます。これは、Pythonがuselib.pyのcounterのコピーをインポートすることを意味しますか?私はフーを呼び出します。カウント? –

+1

@LinMa 'testlib import counter'から' testlib import counter'を書くと、pythonは 'testlib'を検索し、見つかったら' counter'変数を探します。それが見つかると、 'uselib'の現在のスコープに' counter'の初期値をコピーします。これはカウンター参照ではなく、*値*です。 – Li357

+0

Foo.Count()を呼び出す前にアンドリューに感謝します。 –

1

from testlib import countercounterコピーを紹介します。整数型は不変なので、countertestlibの演算の影響を受けません。

あなたは、代わりにこのような何かを試みることができる:

import testlib 
print testlib.counter 
+0

クールスターティング!できます! –