python对象的深复制与浅复制
以下操作会会出现浅拷贝的情况
- 使用切片[:]操作
- 使用工厂函数(如list/dir/set)
- 使用copy模块中的copy()函数
对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址)
import copy class Copy_Test(object): def __init__(self,a): self.a = a a = Copy_Test('AAA') c = a #给这个对象再加上一个引用 print(id(a),id(c)) #内存地址一样 list1 = [1,2,3,4,5,6,7,8,9] list2 = list1[:] #切片复制,2个地址 list2[2] = 8899 print(list1,list2) #list2被改变 list无变化 print(id(list1),id(list2))#内存地址不一样 list3 = [1,2,3,4,5,6,[7,8,9]] list4 = list3[:] print(id(list3),id(list4))#内存地址不一样 list4[6][1] = 88 print(list3,list4)#因为有子列表 所以list4被改变,list3也会随之改变 list5 = [8,[9,8,9]] list6 = copy.copy(list5) list6[1][1] = 88 print(id(list5),id(list6))#内存地址不一样 print(list5,list6)#因为copy是浅拷贝 所以list6被改变,list5也会随之改变 list7 = [8,8,9,456,8,[8,946,8]] list8 = copy.deepcopy(list7) list8[-1][1] = 888 print(id(list7),id(list8))#内存地址不一样 print(list7,list8)#因为copy是深拷贝 所以list6被改变,list5也会随之改变
对于对象中的元素,深拷贝都会重新生成一份(有特殊情况,下面会说明),而不是简单对原始元素的内存地址的引用
对于非容器类型(如数字、字符串、和其他'原子'类型的对象)没有被拷贝一说
如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子