引子:需求:
1、copy一下原来的列表,产生一个新的列表。
2、两个列表需要完全独立开,即一方的操作不会对另一方产生任何影响。
一、浅copy
1、定义:生成一个新列表,把原列表的第一层的内存地址不加区分地完全copy给新列表。
2、效果:
①对其中一个列表中的不可变类型的赋值操作,都是产生了新值,让该列表的索引指向了新的内存地址,所以并不会影响另一个列表。
②对其中一个列表中的可变类型的操作,只是改变的该可变类型的中包含的值,但整体内存地址没有变,因为两个列表中包含的是同一份内存地址,所以另外一个列表中的可变类型会同步改变,其实可以理解为两个列表此时内部包含的该可变类型是共享的。
a = [1,2,[33,44]] # 原列表 b = a.copy() # 复制的新列表 a[0] = 5 a[1] = 6 # 将原列表中的不可表类型重新赋值 a[2][0] = 77 a[2][1] = 88 # 将原列表中的可变类型中的值更改 print(a) # 结果为[5, 6, [77, 88]] print(b) # 结果为[1, 2, [77, 88]],即新列表中的不可变类型不会随原列表更改而变化,而可变类型会随之变化
3、结论:这种浅copy的方式只能满足产生与原列表一样的新列表,无法满足两个列表完全独立。
二、深copy
1、定义:生成一个新列表,检索原列表中的类型,把不可变类型的内存地址完全copy给新列表,在新列表中新建内存空间,重新生成内存地址,把可变类型的仅是值放入。
2、效果:对其中一个列表的操作不会对另一个列表产生任何影响。
import copy # 调用copy模块功能 a = [1,2,[33,44]] # 原列表 b = copy.deepcopy(a) # 复制的新列表 a[0] = 5 a[1] = 6 # 将原列表中的不可变类型重新赋值 a[2][0] = 77 a[2][1] = 88 # 将原列表中的可变类型中的值更改 print(a) # 结果为[5, 6, [77, 88]] print(b) # 结果为[1, 2, [33, 44]],新列表中可变与不可变类型都没有随着原列表的更改而变化,可见已完全独立开
三、结论:要实现开头的需求,需要使用深copy。