【python】深拷贝、浅拷贝和赋值之间有什么区别?

首先Python提供了三种赋值方法,最常见的是赋值=、浅拷贝copy.copy()和深拷贝copy.deepcopy()。


赋值是使用等于号(=),可以对一个变量进行赋值,赋值就是创建了对象的一个新的引用,赋值并不会产生一个独立的对象,它只是给原有的数据对象添加一个新的标签。所以当其中的一个标签被改变的时候,数据对象就会发生变化,另一个标签也会随之改变。Python中的赋值都是进行对象的引用传递,即内存地址的传递。


浅拷贝是使用copy.copy(),可以进行对象的浅拷贝,浅拷贝只拷贝对象本身,并不会拷贝对象内部的嵌套对象。对于内部的嵌套对象依然使用原始的引用。

深拷贝使用copy.deepcopy()可以进行对象的深拷贝,深拷贝会拷贝对象本身以及其所有的嵌套对象。因为深拷贝会将被复制的对象完全再复制一遍,所以深拷贝后的对象会作为新个体单独存在,所以,当我们尝试改变原有对象,不会对已经复制出来的新对象产生影响。

下面coding下做个尝试,通过代码理解其中的思想。

首先,可以肯定的是赋值、深浅拷贝都能将传递对象。

还是看代码,我将原对象a添加了一个数字4,我们看运行结果,a,b随之变化,c,d未变化。

 当我给对象a中的内嵌对象添加一个元素'c'运行结果如下:a,b随之改变,浅拷贝后的对象c也随之变化,深拷贝还是无动于衷。。。

 

 原因如下:

当我去修改对象a,对象a会变化,对象b因为是赋值过来的,传递的是对象a的内存地址,所以对象b也会随着对象a的变化。
深拷贝是无论怎么改动原来的对象a,深拷贝后的新对象d是不会随之变化的。也就是可以这样理解,深拷贝后的新对象与原对象无关。
我们将对象理解为一个人,赋值就是再完完全全复制出一个新的你,原来的你有什么变化,新的你就会发生什么变化,新旧同步。
浅拷贝就是可变的部分会随原对象变化(列表、字典、集合),不可变的部分(数值、字符串、元组)不会随之变化。
还是拿人举例,不可变的比如血型,可变的比如面容。
浅拷贝出来的新的你,不可变的部分是不会随着原来的你发生变化的,可变的部分会随着原来的你发生变化。
原来的你是A型血了,但是被注入了O型血,新的你还是A型血,原来的你整容了,新的你会随之整容。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二琳爱吃肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值