一文搞懂赋值、浅拷贝和深拷贝之间的区别

背景:经常会有人问你深拷贝浅拷贝之间区别,听过多次,但是仍然不是很清楚到底区别在哪里

本文因此做个实验,一文搞懂之间的区别

假如有一个list为a,然后拷贝给b

 我们可以发现构造出一个新的list给了b,就这个例子看起来好像a和b是独立的,虽然实际上不是,后面会看到。

我们想要得到一个一模一样的list,还可以使用赋值语句的方式:

小结:我们可以看到,实际上赋值语句得到的是同一个list,只是使用变量a和b分别对其进行引用

除了使用list()这样的构造的方式可以进行浅拷贝,实际上构造器和copy()结果是一样的,都是属于浅拷贝这也的,我们可以看一下,结果完全一样:

我们通过上面试验,是看不出浅拷贝和深拷贝之间的区别的,因为我们的list里面装的全是常数,这样是看不出来的,我们可以尝试着使用list嵌套装其他数据结构,比如先看一下浅拷贝:

 解读:我们可以看到,浅拷贝讲所有的对象都是共享的,我们修改了b一样会影响a的数值,这样在有一些场景会带来灾难,虽然浅拷贝可以节省内存,但是这样无区分的进行共享肯定会存在问题的,深拷贝只做了一件事,那么就是将可变的数据结构不进行共享,不可变结构还是进行共享,在例子中list作为可变的结构就会单独拷贝一份给b,而常数和元组就会进行共享,因为反正不改变,不会发生这样的灾难,我们看一下深拷贝:

 我们可以看到,list多拷贝出来了一份,这样就独立了,就算修改其中一个也不会影响另外一个了。

注意:上面可视化是使用的pythontutor画的,很好用,可以方便我们理解内存

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值