【问题标题】:Python static variable reassignmentPython静态变量重新分配
【发布时间】:2016-05-29 21:54:36
【问题描述】:

试图理解 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 variables static instance


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多