使用deepcopy与对象内的字典进行问题

时间:2014-04-11 11:23:50

标签: python dictionary

阅读文档,我理解copy.deepcopy(obj)递归地复制了这个文档中的任何其他对象,但是当我运行时:

>>> import copy
>>> class SomeObject:
...     a=1
...     b={1:1,2:2}
... 
>>> o1=SomeObject()
>>> o2=copy.deepcopy(o1)
>>> id(o1)
140041523635624
>>> id(o2)
140041523635912
>>> id(o1.b)
30087968
>>> id(o2.b)
30087968

它似乎没有复制'o1'中的字典。任何人都可以告诉我,如果我做错了什么,或者如何在对象中获得字典的副本?

由于

1 个答案:

答案 0 :(得分:3)

Deepcopy仅复制实例属性。您的b属性是一个类属性。

即使您手动创建副本而是创建SomeObject的新实例,仍然会共享b

>>> class SomeObject:
...     a=1
...     b={1:1,2:2}
... 
>>> so1 = SomeObject()
>>> so2 = SomeObject()
>>> so1.b is so2.b
True
>>> so1.b is SomeObject.b
True

使b成为实例属性:

>>> import copy
>>> class SomeObject:
...     a = 1
...     def __init__(self):
...         self.b = {1: 1, 2: 2}
... 
>>> so1 = SomeObject()
>>> so2 = copy.deepcopy(so1)
>>> so1.b is so2.b
False