2016-05-29 65 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只是初始化爲Foo.a.如果您首先嚐試通過Foo.a修改對象或重新分配f.a,則此解釋可行,但最後幾行我感到困惑。我希望Foo.a = 3只重新分配Foo.a,但它似乎也重新分配了f.a,因爲它不再引用列表對象。如果你首先分配給f.a,Foo.a的重新分配不會改變f.a,所以看起來f.a是Foo.a的合成糖,直到f.a被明確分配爲止。它是否正確?

回答

2

我不會稱之爲語法糖。相反,這是Python範圍內名稱查找順序的結果。

給定一個實例,Python將首先嚐試查找該實例的名稱。如果失敗了,它將會失敗回到課堂上查看它。這就是你的情況所發生的事情;首先,實例中不存在該名稱,因此查找引用類屬性。只要定義了一個實例變量,名稱就會引用該變量。