python-3.x 深拷贝():字典复制不正确的类

qqrboqgw  于 2023-03-09  发布在  Python
关注(0)|答案(3)|浏览(111)

晚上好!
我遇到了一个copy.deepcopy()的问题,我想复制一个有dict自变量的类,结果是:

>>> import copy
>>> class A:
...     a = {'a': 1}
... 
>>> a = A()
>>> a.a
{'a': 1}
>>> b = copy.deepcopy(a)
>>> b.a
{'a': 1}
>>> b.a['a'] = 123
>>> b.a
{'a': 123}
>>> a.a
{'a': 123}
>>>

所以,我复制了一个类,并在它的副本中分配了一个字典项,然后原来的类也改变了。为什么它不复制字典,或者我应该手动做这件事?

zaqlnxep

zaqlnxep1#

您已经定义了A.a为类属性,类、所有子类及其示例之间显式共享该属性,您可以检查a.__dict__,没有发现'a'这样的键,为了正确创建属性,请在__init__函数中设置该属性。

class A:
    def __init__(self):
        self.a = {'a': 1}
carvr3hs

carvr3hs2#

a当前为类变量;它只有一个示例。(应作为A.a访问。)
这没有多大意义;它应该是一个示例变量(这样类的每个示例都有一个单独的dict),可以在__init__方法中设置它。

class A:
    def __init__(self):
        self.a = {'a': 1}
j0pj023g

j0pj023g3#

>>> import copy
>>> class A:
...     a = {'a': 1}
...

这导致A本身,而不是该类的示例包含属性a,即字典。

>>> a = A()
>>> a.a
{'a': 1}

在示例中查找属性可以找到类的对应属性,如果示例没有直接存储同名属性,但它在概念上仍然是类的一部分

>>> b = copy.deepcopy(a)
>>> b.a
{'a': 1}

正如预期的那样,ba的深层副本:也就是说,相同A类的另一个示例,具有所有相同的示例特定数据(即:没有示例专用数据,因为a没有示例专用数据)。

>>> b.a['a'] = 123

赋值给b.a会导致b拥有一个与类分离的a属性。但是,此语法不会这样做-相反,它会从类**(是一个dict)中查找a属性**,并修改dict对象(并且只有一个这样的dict)。

>>> b.a
{'a': 123}
>>> a.a
{'a': 123}
>>>

b.aa.a都查找相同的dict对象--存储在中的对象--因为**ab**都没有自己的示例特定的a属性。

相关问题