晚上好!
我遇到了一个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}
>>>
所以,我复制了一个类,并在它的副本中分配了一个字典项,然后原来的类也改变了。为什么它不复制字典,或者我应该手动做这件事?
3条答案
按热度按时间zaqlnxep1#
您已经定义了
A.a
为类属性,类、所有子类及其示例之间显式共享该属性,您可以检查a.__dict__
,没有发现'a'
这样的键,为了正确创建属性,请在__init__
函数中设置该属性。carvr3hs2#
a
当前为类变量;它只有一个示例。(应作为A.a
访问。)这没有多大意义;它应该是一个示例变量(这样类的每个示例都有一个单独的
dict
),可以在__init__
方法中设置它。j0pj023g3#
这导致类
A
本身,而不是该类的示例包含属性a
,即字典。在示例中查找属性可以找到类的对应属性,如果示例没有直接存储同名属性,但它在概念上仍然是类的一部分。
正如预期的那样,
b
是a
的深层副本:也就是说,相同A
类的另一个示例,具有所有相同的示例特定数据(即:没有示例专用数据,因为a
没有示例专用数据)。赋值给
b.a
会导致b
拥有一个与类分离的a
属性。但是,此语法不会这样做-相反,它会从类**(是一个dict)中查找a
属性**,并修改dict
对象(并且只有一个这样的dict
)。b.a
和a.a
都查找相同的dict
对象--存储在类中的对象--因为**a
和b
**都没有自己的示例特定的a
属性。