Python 静态变量重新赋值
Python static variable reassignment
试图理解 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 的语法糖被明确分配给。这是正确的吗?
我不会称之为语法糖。相反,这是 Python 范围内名称查找顺序的结果。
给定一个实例,Python 将首先尝试在该实例上查找名称。如果失败,它将失败返回到 class 中查找它。这就是您的情况;起初,该名称在实例上不存在,因此查找指的是 class 属性。一旦定义了实例变量,名称就会引用它。
试图理解 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 的语法糖被明确分配给。这是正确的吗?
我不会称之为语法糖。相反,这是 Python 范围内名称查找顺序的结果。
给定一个实例,Python 将首先尝试在该实例上查找名称。如果失败,它将失败返回到 class 中查找它。这就是您的情况;起初,该名称在实例上不存在,因此查找指的是 class 属性。一旦定义了实例变量,名称就会引用它。