【问题标题】:python deepcopy not deepcopying user classes?python deepcopy不深度复制用户类?
【发布时间】:2018-08-08 22:06:24
【问题描述】:

我将直接进入让我提出这样一个问题的示例:

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. 如何获得所需的行为?我的原始代码具有不同级别的嵌套自定义类,这些自定义类具有预定义类型的“最终”属性。

提前致谢

【问题讨论】:

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


    【解决方案1】:

    At least in CPython,ID指向内存中的对象地址。因为 Python 字符串是不可变的,deepcopy 不会创建不同的 ID。确实没有必要在内存中创建不同的字符串来保存完全相同的数据。

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

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

    如果你的元组持有可变对象,那将不会发生:

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-28
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多