Python 中赋值语句(=)不复制对象,而是在目标和对象之间创建绑定关系。对于自身可变或者包含可变项的集合对象,开发者有时会需要生成其副本用于改变操作,进而避免改变原对象。copy 模块提供了通用的浅层复制 copy() 和深层复制 deepcopy() 操作。

  1. copy() 仅复制对象本身,而不对其中的子对象进行复制,如果对原子对象进行修改,那么浅层复制之后的对象也会随着修改。
  2. deepcopy() 是真正意义上的复制,即重新开辟一片空间,经常说的复制实际上就是 deepcopy,深层复制之后的对象不受原对象的影响,无论原对象发生什么修改,深层复制的对象都不会发生改变。
import copy
a = [1, 2, 3, 4, ['a', 'b']]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
a.append(5)
a[4].append('c')
print(a)
print(b)
print(c)
print(d)
print(a is b)

输出结果为

[1, 2, 3, 5, ['a', 'b', 'c'], 5]
[1, 2, 3, 5, ['a', 'b', 'c'], 5]
[1, 2, 3, 4, ['a', 'b', 'c']]
[1, 2, 3, 4, ['a', 'b']]
True

简单来说:

  1. 赋值语句=:与目标对象建立绑定关系,目标对象的父对象和子对象发生改变则赋值后的对象都会随之发生改变
  2. 浅层复制 copy():复制父对象,子对象仍然使用引用的方式,目标对象的子对象发生改变则浅层复制的对象也发生改变
  3. 深层复制 deepcopy():复制了对象和对象的所有子对象,目标对象发生改变对深层复制的对象无影响

Q.E.D.


Nothing really matters to me!