python深拷贝和浅拷贝的区别

一、首先深拷贝和浅拷贝都是对原对象的拷贝,都会生成一个看起来相同的对象,本质区别就是拷贝出来的对象的「地址」是否与原对象一样,即就是对原对象的地址的拷贝,还是值的拷贝

深拷贝:对原对象的地址的拷贝,新拷贝了一份与原对象不同的地址的对象,修改对象中的任何值,都不会改变深拷贝的对象的值。

浅拷贝:对原对象的值的拷贝,地址仍是一个指针指向原对象的地址,浅拷贝或者原对象的值发生变化,那原对象和浅拷贝对象的值都会随着被改变。

浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用

深拷贝(深度克隆):不仅复制对象的基本类,同时也复制原对象的对象,完全是新对象产生的

1.copy.copy 浅拷贝——只拷贝对象,不会拷贝对象的引用对象,不会拷贝原始对象的内部的

2.copy.deepcopy   深拷贝——拷贝对象的值类型,还拷贝了原始对象,而产生了一个新的对象,不仅仅只拷贝了原始对象的引用

二、补充概念:可变对象,不可变对象

可变对象:一个对象在不改变其所指向的地址前提下,可以修改其所执行的地址中的值

不可变对象:一个对象所指向的地址上的值是不能修改的,如果修改了就是它执行的地址就改变了,相当于将这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了。

区别:可变对象就不会这样会修改值后另存到一个新的地址上,而是直接再原对象的地址上把值给改变了,这个对象依然执行这个地址

本质区别:可变对象修改了值,不会新建一个内存地址的对象,不可变对象如果修改了值,及时复制了一份新的内存地址,原始地址的值不会被改变。

不可变元素包含:int,float,complex,long,str,unicode,tuple

可变原生:list

例子:

import copy
a = [1, 2, 3, 4, ['a', 'b']]
b = a #赋值,传对象的引用
c = copy.copy(a) #浅拷贝,对象拷贝
d = copy.deepcopy(a) #深拷贝,对象拷贝

a.append(5) #修改对象a,列表末尾添加数字5
a[4].append('c') #修改对象a中的列表['a', 'b']

print 'a= ', a
print 'b= ', b
print 'c= ', c
print 'd= ', d

输出结果:
a = [1, 2, 3, 4, ['a', 'b', 'c'], 5] #修改了原始对象,变为修改后的列表
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5] #对象的引用,对象的任何值变化都随着变化
c = [1, 2, 3, 4, ['a', 'b', 'c']] #浅拷贝,不可变元素不能改变,可变元素随着原始对的变化而变化了
d = [1, 2, 3, 4, ['a', 'b']] #深拷贝,原始对象的值发生任何变化,深拷贝新的对象内存地址不会发生任何变化

参考:

https://www.cnblogs.com/xiaxiaoxu/p/9742452.html

https://www.huaweicloud.com/articles/794209a39c4555eb5a62145b66b69587.html

  • 23
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值