您是正确的-在
Foo.a访问
self.a实际访问的情况下
Foo.a,该访问在的所有实例之间共享
Foo。但是,当您进行更新时
self.n,
+=实际上在
self该阴影上创建了一个实例级变量
Foo.n:
>>> import dis>>> dis.dis(Foo.bar) 50 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_ADD27 ROT_TWO 28 STORE_ATTR 2 (n) 31 LOAD_ConST 0 (None) 34 RETURN_VALUE换句话说,当您执行
self.a.append('somevalue')此操作时,解释a器将通过名称on从内存中获取数据
Foo,然后对
Foo.a指向的列表进行变异。
另一方面,当您执行
self.n += 1口译员时:
- 取
n
从Foo
(因为它无法找到n
上self
) - 创建一个新的价值
n + 1
- 将新值存储在的属性
n
中self



