【一】深浅拷贝定义
【1】浅拷贝
- 浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象
【2】深拷贝
- 深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存
【二】对比理解
- 浅拷贝
- 简单理解:文件系统的快捷方式
- 仅仅复制了中间的内存地址
- 只会复制一层,如果copy的对象中有可变数据类型(如列表、字典等),修改可变数据类型还会影响拷贝的对象
- 是一种快捷的选项,同时修改
- 深拷贝
- 简单理解:文件系统的复制整个文件
- 不止复制了中间的内存地址,后面变量值也复制了
- 完整复制,无论可变或不可变,都是创建出新的来,以后再改原对象,都不会对copy出的对象造成影响
- 是一种更安全的选项
【三】代码理解
(1)复制不可变数据类型
import copy
a = 1
b = copy.copy(a)
print(id(1))
print(a, b)
print(id(a), id(b))
a = 2
print(a, b)
print(id(a), id(b))
(2)浅拷贝:复制可变数据类型和不可变数据类型
import copy
a = [1, [1]]
b = copy.copy(a)
print(a, b)
print(id(a), id(a[0]), id(a[-1]), id(a[-1][0]))
print(id(b), id(b[0]), id(b[-1]), id(b[-1][0]))
a[0] = 2
a[-1][0] = 2
print(a, b)
print(id(a), id(a[0]), id(a[-1]), id(a[-1][0]))
print(id(b), id(b[0]), id(b[-1]), id(b[-1][0]))
(3)深拷贝:复制可变数据类型,修改内部的不可变数据类型
a = [1, 2, 3, 4]
b = [a, a, a]
b_copy = copy.deepcopy(b)
b[1][1] = 100
print(b)
print(b_copy)
- 原始内容和深拷贝内容不一样,因为深拷贝以后已经是两块不同的数据