Python类变量int vs数组

6

我正在尝试使用Python类,并得出了以下示例,其中两个表面上是静态类变量的变量在修改时具有不同的行为。

这是怎么回事?我的第一反应是引用存在某些棘手的问题。

class Foo:
    a = []
    n = 0
    def bar(self):
            self.a.append('foo')
            self.n += 1

x = Foo()
print x.a, x.n    ([] 0)
x.bar()
print x.a, x.n    (['foo', 1])
y = Foo()
print y.a, y.n    (['foo', 0])
y.bar()
print y.a, y.n    (['foo', 'foo'], 1)

1
这里有一个类似的Python案例需要注意:https://dev59.com/oHVD5IYBdhLWcg3wE3No - qwwqwwq
1个回答

5
你说得没错 - 对于Foo.a访问self.a,实际上是访问Foo.a,它在所有Foo实例之间是共享的。但是,当你使用+=更新self.n时,实际上会在self上创建一个实例级变量,会覆盖Foo.n
>>> import dis
>>> dis.dis(Foo.bar)
  5           0 LOAD_FAST                0 (self)
              3 LOAD_ATTR                0 (a)
              6 LOAD_ATTR                1 (append)
              9 LOAD_CONST               1 ('foo')
             12 CALL_FUNCTION            1
             15 POP_TOP             

  6          16 LOAD_FAST                0 (self)
             19 DUP_TOP             
             20 LOAD_ATTR                2 (n)
             23 LOAD_CONST               2 (1)
             26 INPLACE_ADD         
             27 ROT_TWO             
             28 STORE_ATTR               2 (n)
             31 LOAD_CONST               0 (None)
             34 RETURN_VALUE    

换句话说,当您执行self.a.append('some value')时,解释器通过Foo上的名称从内存中获取a,然后改变Foo.a指向的列表。
另一方面,当您执行self.n += 1时,解释器会:
  • Foo中获取n(因为在self上找不到n
  • 创建一个新值n + 1
  • 将新值存储在self上的属性n

明白了。对我来说,导致阴影的赋值被“+=”混淆了。谢谢! - mcamac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接