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也会随之改变

对于对象中的元素,深拷贝都会重新生成一份(有特殊情况,下面会说明),而不是简单对原始元素的内存地址的引用

对于非容器类型(如数字、字符串、和其他'原子'类型的对象)没有被拷贝一说

如果元祖变量只包含原子类型对象,则不能深拷贝,看下面的例子

猜你喜欢

转载自www.cnblogs.com/arrow-kejin/p/8972047.html