Python的copy.deepcopy真的能复制一切吗?

时间:2014-10-15 13:37:30

标签: python 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

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

1 个答案:

答案 0 :(得分:3)

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

这是一个快速演示,显示了列表( mutable )和元组( immutable )之间的区别:

>>> 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