Python静态变量重新分配

时间:2016-05-29 21:54:37

标签: python variables static instance

试图理解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和f.a是单独的名称,但f.a首先被初始化为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被明确赋值给。这是对的吗?

1 个答案:

答案 0 :(得分:2)

我不会称它为语法糖。相反,它是Python作用域中名称查找顺序的结果。

给定一个实例,Python将首先尝试在该实例上查找名称。如果失败了,它将无法回到课堂上查找。这就是你的情况;首先,实例上不存在该名称,因此查找引用了class属性。一旦定义了实例变量,名称就会引用它。