深拷贝和浅拷贝
一、浅拷贝
是对于一个对象的顶层拷贝,拷贝引用地址,没有拷贝内容,内存地址一样,共享地址~!
例子:
a = [1,2,3]
b = [4,5,6]
c = [a,b]
e = c
>>> id(c)
140693012256888
>>> id(e)
140693012256888
copy.copy
如果是可变类型,只拷贝第一层,id地址不一样,如果是不可变类型,一层都不拷贝直接指向,id地址一样!
不可变类型:
例子:
list1 = [1,2]
list2= list2[:]
list2[0]=1
#list2 变化了,但是list1没有变化,id执行地址不同(只拷贝一层),也是浅拷贝
print(id(list1),id(list2))
#如果有了子列表
list3=[3,4,[1,2]]
list4=list3[:]
list4[2][0]=111
#内存地址还是不一样,因为只拷贝一层,有共同指向子列表,所以list4的子列表变化了,list3的子列表变化了。
以下操作会会出现浅拷贝的情况
- 使用切片[:]操作
- 使用工厂函数(如list/dir/set)
- 使用copy模块中的copy()函数
二、深拷贝
1、深拷贝
另外创建一份内容出来,id地址不一样。
深拷贝:copy.deepcopy()
得到了不该得到的得到,就会失去不该失去的失去!
忍受别人不能忍受的忍受,就能享受别人不能享受的享受!