Python类变量int vs array
我在玩Python类,并得到了下面的示例,其中两个看起来是静态类变量的变量在修改时具有不同的行为 这是怎么回事?我的第一直觉是,一些棘手的事情正在发生Python类变量int vs array,python,class,Python,Class,我在玩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 (['f
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)
您是正确的-在
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
- 将新值存储在
onn
self
+=
后面被混淆了。谢谢这里有一个类似的python案例