foo.py:Pythonでのインポートは静的な解決方法ですか?
i = 10
def fi():
global i
i = 99
がbar.py:
import foo
from foo import i
print i, foo.i
foo.fi()
print i, foo.i
これには問題があります。 foo.i
が変更されたときにi
が変更されないのはなぜですか?
foo.py:Pythonでのインポートは静的な解決方法ですか?
i = 10
def fi():
global i
i = 99
がbar.py:
import foo
from foo import i
print i, foo.i
foo.fi()
print i, foo.i
これには問題があります。 foo.i
が変更されたときにi
が変更されないのはなぜですか?
はfoo.py
モジュールの名前空間のi
と呼ばれる識別子と同じアドレスを指すbar.py
モジュールの名前空間でi
と呼ばれる識別子を設定しています。
これは...重要な違いですbar.i
はなく、むしろ、オブジェクト10
がfoo.i
が同時に指すように起こることを保持するメモリ内の同じスペースに、foo.i
を指していません。 Pythonでは、変数名はメモリ空間ではありません。メモリ空間を指す識別子です。 barでインポートすると、ローカルの名前空間識別子を設定しています。
コードはfoo.fi()
が呼び出されるまでfoo.py名前空間の識別子i
が明らかに今10とは異なる場所モジュールのメモリ内のオブジェクトであるリテラル99、を指すように変更されたときに、予想通りに振る舞いますfoo
の-level namespace dictには、i
があり、bar.pyの識別子i
とは異なるメモリを識別します。
シェーンとrossfabricantは、あなたが望むものを達成するためにモジュールを調整する方法についての良い提案をしています。 foo.py
内部
グローバル変数を参照する代わりに関数を呼び出すことができます。ロスが言っている何
はそうのようなFOOをrestuctureすることです:
_i = 10
def getI():
return _i
def fi():
global _i
_i = 99
次に、あなたはそれがあなたが望むように動作します表示されます。
>>> import foo
>>> print foo.getI()
10
>>> foo.fi()
>>> print foo.getI()
99
それはまた意味で「より良い」ですグローバルにエクスポートすることは避けられますが、引き続き読み込みアクセスを提供します。 bar.py
に何import
i
はbar.py
内の1つから異なるi
あります。 bar.py
にあなたが行うと:
foo.py
でi
と同じオブジェクトを参照すること
bar.py
で新しい
i
を作成
from foo import i
。
あなたの問題がある:あなたはfoo.fi()
を呼び出し、それがいることをした場合:
i = 99
割り当てが別の整数オブジェクト(99
)にfoo.py
のi
ポイントを作ること。整数オブジェクトは自分自身(不幸なことに)不変なので、foo.py
のi
が指しているものだけを変更します。bar.py
のi
ではありません。 bar.py
のi
は、まだ前に指していた古いオブジェクトを指しています。
(不変オブジェクト10
整数)あなたはbar.py
で次のコマンドを配置することによって、私が何を言っているかテストすることができます。
print foo.i
それは99
を印刷する必要があります。
いい説明。 –
出力は次のとおりです。10 10 \ n 10 99 –
質問は本当に明確ではありません。ちょうどfoo.iを使用して、正確に何が問題なのですか?怠惰? – hasen
これはかなり初心者の質問です。彼はfoo.fi()を呼び出した後、私が99になることを望んでいます。彼が欠いているのはモジュールの実行だと私は思う。 +1を中和する。 –