python 赋值语句不会复制对象,只会指向目标对象。当一个值改变时,另一个值会跟着改变。copy
模块提供了浅拷贝和深拷贝,可以解决这一问题。
import copy
浅拷贝
浅拷贝开辟一个新的内存空间,创建一个新的对象,其中的每个元素都是原对象中子对象的引用。
x = [[1, 2, 3], [10, 20, 30]]
y = copy.copy(x)
如果仅对 y
增加元素,x
不会改变。
y.append(100)
# x [[1, 2, 3], [10, 20, 30]]
# y [[1, 2, 3], [10, 20, 30], 100]
如果改变 y
中第一个列表,则 x
也会改变。
y[0].append(100)
# x [[1, 2, 3, 100], [10, 20, 30]]
# y [[1, 2, 3, 100], [10, 20, 30]]
深拷贝
深拷贝构造一个新的对象,并把原对象中的元素拷贝插入其中。
copy.deepcopy(x[, memo])
新对象与原对象没有任何关联。
如果深度拷贝中,被拷贝的对象如果存在指向自身的引用,则会陷入无限循环。memo
参数可以防止递归拷贝。
可以通过定义类的__copy__()
和__deepcopy__()
方法定义实现。
更详细的内容参考copy。