python deepcopy不能对用户类进行深度复制吗?

时间:2018-08-08 22:06:24

标签: python-3.x deep-copy weak-references

我将直接看一个使我问这样一个问题的例子:

Python 3.6.6 (default, Jul 19 2018, 14:25:17) 
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from copy import deepcopy

In [2]: class Container:
   ...:     def __init__(self, x):
   ...:         self.x = x
   ...:         

In [3]: anobj = Container("something")

In [4]: outobj = Container(anobj)

In [5]: copy = deepcopy(outobj)

In [6]: id(copy) == id(outobj)
Out[6]: False

In [7]: id(copy.x) == id(outobj.x)
Out[7]: False

In [8]: id(copy.x.x) == id(outobj.x.x)
Out[8]: True

根据Deepcopy的文档,我希望最后一行的响应为False,即Deepcopy也将克隆该字符串。

  1. 为什么不是这样?
  2. 如何获得所需的行为?我的原始代码具有不同级别的嵌套自定义类,这些自定义类具有预定义类型的“最终”属性。

预先感谢

1 个答案:

答案 0 :(得分:0)

At least in CPython,该ID指向内存中的对象地址。由于Python字符串是不可变的,因此deepcopy不会创建其他ID。确实不需要在内存中创建其他字符串来保存完全相同的数据。

仅包含不可变对象的元组也会发生同样的情况,例如:

>>> from copy import deepcopy
>>> a = (1, -1)
>>> b = deepcopy(a)
>>> id(a) == id(b)
True

如果您的元组包含可变的objets,则不会发生:

>>> a = (1, [])
>>> b = deepcopy(a)
>>> id(a) == id(b)
False

所以最后的答案是:deepcopy对于您的类来说工作得很好,您刚刚发现了关于复制不可变对象的 gotcha