直接赋值:对象的引用。
例如:
a = [1,2,3,4,[5,6]]
b = a
a[0] = 11
a[4][0] = 55
print(a) #[11, 2, 3, 4, [55, 6]]
print(b) #[11, 2, 3, 4, [55, 6]]
a的改变会引起b的改变,当然,b改变的同时,a也会改变。a和b是完全相同的。
a = [1,2,3,4,[5,6]]
b = a
a[0] = 11
b[4][1] = 66
print(a) #[11, 2, 3, 4, [5, 66]]
print(b) #[11, 2, 3, 4, [5, 66]]
浅拷贝:b = a.copy(),只拷贝父对象,不会拷贝父对象内部的子对象。
a = [1,2,3,4,[5,6]]
b = a.copy()
a[0] = 11
b[4][1] = 66
print(a) #[11, 2, 3, 4, [5, 66]]
print(b) #[1, 2, 3, 4, [5, 66]]
注意结果:[11, 2, 3, 4, [5, 66]]
[1, 2, 3, 4, [5, 66]]
使用切片、工厂函数(如list、set等)时会产生浅拷贝效果。
深拷贝:使用copy模块的deepcopy方法,完全拷贝父对象和子对象。
import copy
a = [1,2,3,4,[5,6]]
b = copy.deepcopy(a)
a[0] = 11
a[4][1] = 66
print(a) #[11, 2, 3, 4, [5, 66]]
print(b) #[1, 2, 3, 4, [5, 6]]
结果: [11, 2, 3, 4, [5, 66]] [1, 2, 3, 4, [5, 6]]
a和b的改变不会相互影响。
注意:对于非容器类型没有拷贝的说法;
元组中如果只有原子类型对象,则不能深拷贝。
参考文章: