python 深浅拷贝
python 的基础数据类型中,list,dict,set(不可哈希) 这三个类型都有一个copy方法,今天我们看下这个copy方法
拿list 列举:
在list中 copy方法 及[:]的方式叫做浅copy,只会复制数据的第一层,嵌套在内存的数据还是指向同一个内存地址。
a = [1,2,[1,2,3,[1,2,3,[1,2,3,[1,2,3]]]]] b = a.copy() c = a[:] #列表第一层 print("第一层") print(id(a)) print(id(b)) print(id(c)) #列表第二层 print("第二层") print(id(a[2])) print(id(b[2])) print(id(c[2])) #列表第三层 print("第三层") print(id(a[2][3])) print(id(b[2][3])) print(id(c[2][3])) #结果 第一层 2007342659528 2007342659464 2007342659400 第二层 2007342659592 2007342659592 2007342659592 第三层 1782606896 1782606896 1782606896
除了列表第一层的地址是不同的,列表内部的嵌套数据都是指向用一个地址。
import copy a = [1,2,[1,2,3,[1,2,3,[1,2,3,[1,2,3]]]]] b = copy.deepcopy(a) #列表第一层 print("第一层") print(id(a)) print(id(b)) #列表第二层 print("第二层") print(id(a[2])) print(id(b[2])) #列表第三层 print("第三层") print(id(a[2][3])) print(id(b[2][3])) #结果 第一层 1360314447816 1360314447752 第二层 1360314447880 1360314447688 第三层 1360314447944 1360314447624
使用deepcopy 生成的新对象,是完全的另一个对象,外层和内存的元素都是新的内存地址。