python中浅拷贝和深拷贝的区别

在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,深拷贝是将原对象里面的可变元素和不可变元素重新打印一份并重新分配地址,这个是浅拷贝相对于深拷贝最根本的区别。

举例说明

# import copy
# #浅拷贝
# acc1=['Charlie',['credit',0,'有所谓']]
# acc2=acc1[:]#通过切片进行拷贝
# acc3=list(acc1)#适用对象化实例的赋值方法
# acc4=copy.copy(acc1)#通过copy库函数中的copy进行赋值
# print(id(acc1),id(acc2),id(acc3),id(acc4))#输出的结果4个值的地址是不相同的
# #通过进行切片和copy.copy,对象化实例的方法进行的复制都可以认为是浅拷贝
# #对于列表对象中的元素,浅拷贝产生的新对象只存储原始元素的引用(内存地址),所以两个列表对象的元素的引用都指向同一个内存地址
# acc2[0]='无所谓'
# acc2[1][0]='值改变'#其中acc[1][0]是一个索引,而acc2进行的是浅拷贝,所以该索引指向的元素和acc1[1][0]指向的元素是相同的
# acc4[1][1]=1231#同理acc4[1][1]和acc3[1][2]的索引和acc2[1][0]的索引是相同的概念
# acc3[1][2]='没有'
# print(acc1,acc2,acc3,acc4)
# #深拷贝
# #深拷贝与浅拷贝的不同点在于深拷贝可以将acc1中的所有子对象复制并产生一个新的对像
# acc5=copy.deepcopy(acc1)
# acc5[1][0]='没有然后'#此时的acc5[1][0]该索引与acc1[1][0]索引指向的对象不是同一个对象
# print(id(acc1),id(acc5))
# print(acc1)
# print(acc5)
#

同时可以这样理解

深拷贝就是完全跟以前就没有任何关系了,原来的对象怎么改都不会影响当前对象

浅拷贝,原对象的list元素改变的话会改变当前对象,如果当前对象中list元素改变了,也同样会影响原对象。

通常复制的时候要用深拷贝,因为浅拷贝后,两个对象中不可变对象指向不同地址,相互不会改变,但是两个对象中的可变元素是指向相同的地址,一个变了,另一个会同时改变,会有影响(list是可变对象)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值