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

2024-04-25 19:20:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: keyinselfforinitvaluedefitems
1条回答
网友
1楼 · 发布于 2024-04-25 19:20:10

以下情况会发生什么:

实例化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引用,使它现在指向这个新字典(不再与旧字典有任何关系!)你知道吗

这相当于:

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

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

相关问题 更多 >