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

tom*_*tom 3 python copy deep-copy python-2.7

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

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

jon*_*rpe 5

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
Run Code Online (Sandbox Code Playgroud)