2016-05-29 13 views
0

のPythonに静的変数を理解しようとし、次は私を混乱させる:Pythonの静的変数の再割り当て

>>> class Foo(): 
...  a = [1] 
... 
>>> f = Foo() 
>>> Foo.a.append(2) 
>>> Foo.a 
[1, 2] 
>>> f.a 
[1, 2] 
>>> f.a.append(3) 
>>> f.a 
[1, 2, 3] 
>>> Foo.a 
[1, 2, 3] 
>>> # appears that Foo.a and f.a reference same list object 
... 
>>> Foo.a = 3 
>>> f.a 
3 
>>> Foo.a 
3 

この質問(Static class variables in Python)にトップの回答に基づいて、私はFoo.aとFAが分離されていることを期待しますしかし、faは最初にFoo.aに初期化されます。この説明は、最初にFoo.aでオブジェクトを修正しようとするか、f.aを再割り当てしようとした場合に機能しますが、最後の数行で混乱します。私はFoo.a = 3がFoo.aの再割り当てだけを期待するだろうが、もはやリストオブジェクトを参照していないので、f.aも再割り当てされたようだ。最初にf.aに割り当てた場合、Foo.aの再割り当てはf.aを変更しないので、f.aはf.aが明示的に割り当てられるまでFoo.aの構文的な砂糖です。これは正しいです?

答えて

2

私はそれを構文的な砂糖と呼んでいません。むしろ、Pythonスコープでの名前検索の結果です。

インスタンスがある場合、Pythonはまずそのインスタンスの名前を検索しようとします。それが失敗すると、クラスでそれを見つけ出すことに失敗します。これはあなたの場合に起こっていることです。最初は名前がインスタンスに存在しないため、参照はクラス属性を参照します。インスタンス変数が定義されるとすぐに、その名前が参照されます。

関連する問題