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)