python deepcopy没有深度复制用户类?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (131)

我会直截了当地向我提出这样一个问题:

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. 我怎样才能获得所需的行为?我的原始代码具有各种级别的嵌套自定义类,其中“final”属性是预定义类型。

提前致谢

提问于
用户回答回答于

至少在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是工作就好了你的班,你只是找到了一个疑难杂症有关复制不可变对象。

扫码关注云+社区

领取腾讯云代金券