python类更改另一个类。为什么?

时间:2012-10-29 23:48:23

标签: python class

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

1 个答案:

答案 0 :(得分:4)

以下内容会发生什么:

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

更容易理解这一点的方法是将a.gb.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}时,请执行以下步骤:

  1. 创建新词典:{"s":3, "b":2}
  2. 修改b.f引用,使它现在指向这个新词典(并且与旧词典无关!)
  3. 这相当于:

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

    a.g引用保持不变,因此保持不变 因此,a.gb.f 不再引用相同的基础对象