Python 的 copy.deepcopy 真的会复制所有内容吗? [复制]

Posted

技术标签:

【中文标题】Python 的 copy.deepcopy 真的会复制所有内容吗? [复制]【英文标题】:Does Python's copy.deepcopy really copy everything? [duplicate] 【发布时间】:2014-12-10 14:49:26 【问题描述】:

我的印象是 deepcopy 会递归地将所有内容复制到树上,但我遇到的情况似乎与我之前的想法背道而驰。

>>> item = "hello"
>>> a["hello"] = item
>>> b = copy.deepcopy(a)
>>> id(a)
31995776
>>> id(b)
32733616             # I expected this
>>> id(a["hello"])
140651836041376
>>> id(b["hello"])
140651836041376      # I did not expect this

a 和 b 的 id 不同,这是我预料的,但内部项仍然是同一个对象。 deepcopy是否只复制到一定深度?或者这是特定于 Python 存储字符串的方式? (我也得到了类似的整数结果)

【问题讨论】:

字符串和整数是不可变的,所以deepcopy 不必费心创建一个副本——无论如何你都无法更改它们。 想必如果一个项目是不可变的,就不需要复制它了? 知道了,谢谢。如果你们中的一个人将其作为答案发布,我会将其标记为已解决。 【参考方案1】:

deepcopy 只需要创建可变 对象的副本,例如列表和字典。字符串和整数是不可变的;它们不能就地更改,因此无需显式创建副本,而是插入对同一对象的引用。

这是一个快速演示,展示了列表(可变)和元组(不可变)之间的区别:

>>> import copy
>>> l = [[1, 2], (3, 4)]
>>> l2 = copy.deepcopy(l)
>>> l2[0] is l[0]
False # created new list
>>> l2[1] is l[1]
True # didn't create new tuple

【讨论】:

以上是关于Python 的 copy.deepcopy 真的会复制所有内容吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

[PYTHON] 深度解析copy.copy() 与 copy.deepcopy()

Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

Python---copy()deepcopy()与赋值的区别

python(41):copy拷贝(深拷贝deepcopy与浅拷贝copy)

Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

骑士计划-python全栈07 集合,深浅copy(copy,deepcopy)