Python 中赋值语句不复制对象,而是在目标和对象之间创建绑定关系。对于自身可变或者包含可变项的集合对象,开发者有时会需要生成其副本用于改变操作,进而避免改变原对象。copy 模块提供了通用的浅层复制 copy()
和深层复制 deepcopy()
操作。
-
copy()
仅复制对象本身,而不对其中的子对象进行复制,如果对原子对象进行修改,那么浅层复制之后的对象也会随着修改。 -
deepcopy()
是真正意义上的复制,即重新开辟一片空间,经常说的复制实际上就是 deepcopy,深层复制之后的对象不受原对象的影响,无论原对象发生什么修改,深层复制的对象都不会发生改变。
>>> import copy
>>> list1 = [1, 2, [3, 4], 5]
>>> list2 = copy.copy(list1)
>>> list3 = copy.deepcopy(list1)
>>> list2 == list3
True
>>> list2 is list3
False
以上两个列表 list2 和 list3 分别经过了浅层复制和深层复制,虽然值是一样的,但是本质上并不是同一个列表
>>> import copy
>>> list1 = [1, 2, [3, 4], 5]
>>> list2 = copy.copy(list1)
>>> list3 = copy.deepcopy(list1)
>>> list1[2][0] = 3333
>>> list1
[1, 2, [3333, 4], 5]
>>> list2
[1, 2, [3333, 4], 5]
>>> list3
[1, 2, [3, 4], 5]
将原列表的子对象 [3, 4]
改成 [333, 4]
,可以看到浅层复制后 list2 的值也会改变,而深层复制后 list3 的值并不会改变。
简单来说:
- 浅层复制
copy()
:复制父对象,子对象仍然使用引用的方式; - 深层复制
deepcopy()
:复制了对象和对象的所有子对象。