复习到了Python的深浅拷贝,在论坛上的博客看的云里雾里的(太菜了看不懂),索性自己整理的一下,水平有限,如有不足之处欢迎指出.
主要从修改拷贝数据对原数据的影响和拷贝后地址的变化两方面来说
import copy
ls1 = ['张轩','李岚','王晨',['周明','刘峰']]
ls2 = ls1#赋值,对象的引用 浅拷贝
ls3 = ls1[:]#切片是浅拷贝
ls4 = ls1.copy()#浅拷贝
ls5 = copy.deepcopy(ls1)#深拷贝
# 总结:浅拷贝修改第二层列表元素时原数据跟着变,深拷贝不变,修改第一层元素时,深浅拷贝的元数据都不会跟着变
#如果是ls2=ls1这样的对象引用,则一层数据的修改也会影响到原数据
#地址变化:
#可变是指与原数据的地址不同
# 浅拷贝一层若是可变数据类型,则两个地址不一样,是不可变数据类型地址一样
# 要是两层:一般都是外层可变,内层不变,如果是不可变数据类型则该层不变--->因为内层不变所以改变原列表,拷贝后的列表也跟着变
# 深拷贝一层如果是不可变数据类型就两个地址不变,是是可变数据类型就可变
# 深拷贝两层一半内外层地址都发生改变,如果是不可变数据类型则该层就不变---->因为内层地址可变,所以修改第二层列表元素的值时不会相互影响
# 赋值引用,就算是一层列表元素的改变也会相互关联
# print(id(ls1))#1519064713792
# print(id(ls2))#1519064713792
# print(id(ls3))#1519064714624
# print(id(ls4))#1519064714048
# print(id(ls5))#1519064822144
# ls2[2] = "Miku"
# print(ls1, ls2,sep="\n")
# ls3[0] = "Miku"
# print(ls1, ls3,sep="\n")
# ls4[0] = "Miku"
# print(ls1, ls4,sep="\n")
# ls4[3][0] = "Miku" 浅拷贝修改第二层列表元素时都变
# print(ls1, ls4,sep="\n")
# ls5[3][0] = "Miku" 深拷贝修改第二层列表元素时都不变
# print(ls1, ls5,sep="\n")