我将直接看一个使我问这样一个问题的例子:
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也将克隆该字符串。
预先感谢
答案 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 。