2016-05-29 27 views
0

Der Versuch, Python statische Variablen zu verstehen, und die folgende verwirrt mich:Python statische Variable Neuzuordnung

>>> 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 

Basierend auf der oben Antwort auf diese Frage (Static class variables in Python), ich würde erwarten, dass Foo.a und fa getrennt sind Namen, aber dieses Fa wird erst mit Foo.a initialisiert. Diese Erklärung funktioniert, wenn Sie zuerst versuchen, das Objekt über Foo.a zu ändern oder f.a neu zuzuweisen, aber ich bin verwirrt durch die letzten Zeilen. Ich würde erwarten, dass Foo.a = 3 Foo.a nur neu zuweist, aber es scheint auch für fa neu zugewiesen worden zu sein, da es nicht länger auf das Listenobjekt verweist. Wenn Sie zuerst f.a zuweisen, ändert die Neuzuordnung von Foo.a nicht f.a, so dass es scheint, dass f.a syntaktischer Zucker für Foo.a ist, bis f.a explizit zugewiesen wird. Ist das richtig?

Antwort

2

Ich würde es nicht syntaktischen Zucker nennen. Es ist vielmehr eine Konsequenz der Namenssuche in Python-Bereichen.

Bei einer gegebenen Instanz versucht Python zuerst, einen Namen für diese Instanz zu suchen. Wenn das fehlschlägt, wird es nicht mehr möglich sein, in der Klasse nachzuschlagen. Das ist, was in deinem Fall passiert; Der Name existiert zunächst nicht in der Instanz, daher bezieht sich die Suche auf das Klassenattribut. Sobald eine Instanzvariable definiert ist, bezieht sich der Name darauf.