我怎么会改成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)
以下情况会发生什么:
实例化
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
引用,使它现在指向这个新字典(不再与旧字典有任何关系!)你知道吗这相当于:
a.g
引用保持不变,因此保持不变。因此,
a.g
和b.f
不再引用相同的基础对象。你知道吗相关问题 更多 >
编程相关推荐