#浅拷贝(复制一份,就相当于抄一遍)
list1 = ['赤,橙,黄,绿,青,蓝,紫']
list2 = list1[:] #切片会产生一个新的列表
list3 = list1.copy() #浅拷贝
print(id(list1))
print(id(list2))
print(id(list3))
结果内存地址都不一样:
内存地址 3276933495680
内存地址 3276963987136
内存地址 3276963986880
浅拷贝如图示范:
1 list1 数据为列表 [赤,橙,黄,绿,青,蓝,紫 ] 内存地址为1a1b list1指针指向内存地址1a1b list1的数据改变不会影响到list2
2 list2 执行切片 或者 copy的时候,会产生一个新的列表 内存地址为2a2b list2指针指向2a2b
注意浅拷贝的另外一种情况: list1的数据改变为什么会影响到list2 ? 浅拷贝不是说只是复制一份吗? 在浅拷贝后;追加的list3.append('蓝') 为什么list2还是会有"蓝"? 看图解释
list1 = ['赤','橙','黄',['青']]
list2 = list1.copy()
list1[3].append("蓝")
print(list1) ['赤', '橙', '黄', ['青', '蓝']]
print(list2) ['赤', '橙', '黄', ['青', '蓝']]
从图中可以看出来,['青'] 在嵌套列表中还是一个内存地址,当list2浅拷贝list1的内容适合,实际是['赤','橙','黄',内存地址3a3b],
当list1进行list1[3].append("蓝")的时候,实际是修改的这个3a3b内存地址内容,list2读3a3b内存地址发现是指向的['青','蓝'],所以内容也会改变.
验证内存地址一样
print(id(list1[3]))
print(id(list2[3]))
深拷贝
1 #深拷贝需要使用copy模块
import copy
list1 = ['赤','橙','黄',['青']]
list2 = copy.deepcopy(list1) #深拷贝,简单来说就是全部复制一份
list1[3].append("蓝")
print(id(list1[3])) 内存地址跟list2[3]不一样
print(id(list2[3])) 内存地址跟list1[3]不一样
print(list1[3])
print(list2[3])
如图示:深浅拷贝最大的区别在['青']这个对象,如果是浅拷贝list1 和 list2 列表中的 ['青']对象内存地址是同一个,如果是深拷贝, ['青']对象内存地址在深拷贝的时候,会重新拷贝一份新的产生一个新的内存地址,list1 和list2 2个数据从此再无关联
深拷贝,就类似于,我要制作一个孙悟空,我连孙悟空的师傅师弟全部做一份新的, 浅拷贝;我新制作一个孙悟空,但是师傅师弟还是用同一份
总结:
赋值操作,没有创建对象
浅拷贝,只拷贝第一层 使用切片[:] or copy() 做浅拷贝操作
深拷贝,把这个对象内容以及内部的所有内容全部拷贝一遍,使用copy模块