1

那我怎么改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)
4

1 回答 1

4

以下情况会发生什么:

当您实例化时b = B(a),您的B.__init__方法设置b.f = a.g

掌握这一点的更简单方法是考虑a.gb.f作为对另一个对象(实际字典)的引用。这意味着它们指向一个对象——它们不是对象本身。

Doingb.f = a.g意味着b.f现在引用相同的底层对象,a.g仅此而已。

当您这样做时b.f["s"]=3,您正在修改引用的基础对象b.f

这恰好与a.g引用的相同,因此a.g也“更改”了!


回复您的评论:

当你这样做时b.f={"s":3, "b":2},你采取以下步骤:

  1. 创建一个新字典:{"s":3, "b":2}
  2. 修改b.f引用,使其现在指向这个新字典(不再与旧字典有任何关系!)

这相当于:

new_dict = {"s":3, "b":2}
b.f = new_dict

参考 a.g保持不变,因此保持不变。
因此,a.g不再b.f 引用相同的底层对象

于 2012-10-29T23:51:45.950 回答