我怎么改变A级? 第一个打印:
{"s":1, "b":2}
第二个
{"s":3, "b":2}
但我认为我应该和第一个一样
class A():
def __init__(self, **kwargs):
self.g =""
for key, value in kwargs.items():
setattr(self, key, value)
class B():
def __init__(self, classA):
self.f = classA.g
a = A(g={"s":1, "b":2})
print (a.g)
b = B(a)
b.f["s"]=3
print (a.g)
答案 0 :(得分:4)
以下内容会发生什么:
当您实例化b = B(a)
时,您的B.__init__
方法会设置b.f = a.g
。
更容易理解这一点的方法是将a.g
和b.f
视为引用到另一个对象(实际的dict)。这意味着他们指向一个对象 - 他们不是对象本身。
执行b.f = a.g
意味着b.f
现在引用了a.g
所做的相同基础对象,这就是全部。
执行b.f["s"]=3
时,您修改 b.f
引用的基础对象。
这恰好与a.g
引用相同,因此a.g
也被“更改”了!
回复您的评论:
执行b.f={"s":3, "b":2}
时,请执行以下步骤:
{"s":3, "b":2}
b.f
引用,使它现在指向这个新词典(并且与旧词典无关!)这相当于:
new_dict = {"s":3, "b":2}
b.f = new_dict
a.g
引用保持不变,因此保持不变
因此,a.g
和b.f
不再引用相同的基础对象。