根据我的理解,
对于像列表这样的可变对象,如果底层对象支持像列表这样的变异,则 +=(增强赋值)会导致对象发生变异。当然,这不适用于不支持突变的不可变对象,因为__iadd__它不存在并且__add__是被调用的对象。
考虑以下代码:
class TestClass:
bar = []
def __init__(self, x):
self.bar += [x]
f = TestClass(1)
g = TestClass(2)
h = TestClass(3)
print(f.bar)
print(g.bar)
print(TestClass.bar)
Run Code Online (Sandbox Code Playgroud)
现在,我明白为什么所有三个 g,f,h 都会打印出来,[1, 2, 3]因为我们正在“改变”类属性。
但是当我尝试通过执行来查看对象的命名空间时 print(f.__dict__)查看,我也看到了对象内部的 bar 属性。
问题 1:如果发生变异的实际属性是类属性,为什么在对象命名空间中创建实例?
其次,“如果”在对象中创建了该实例变量(如 f),那么f.bar += 4应该只影响对象 f,因为 f 中的新实例变量 bar 应该遮蔽了类属性。但是我看到f.bar+=4反过来这样做也会更新 class 属性,这让我感到非常困惑。
有人可以帮我解决这个问题吗?