python笔试题深浅拷贝的关系

变量与对象之间的关系

在许多语言中,对象跟变量都是很容易弄混淆的两个概念。
在这里插入图片描述
在上图中,我们把a赋值为5,那么是否就可以说a是一个整型对象呢。事实不是这样的,或者说这种说法不够严谨。

a只是一个变量,他的地址指向了5这个整型对象。在这里插入图片描述

我们再把a的值赋给b,打印发现两个变量的id相同。说明两个变量指向了同一个对象。这个时候我们对a重新进行赋值。

在这里插入图片描述

这时候我们发现a的重新赋值,并不影响b的结果。事实上也是这样,a的重新赋值只是改变的a所指向的对象。并不会对b的地址造成影响,但是如果是对该对象的值进行修改呢。

我们都知道在python中,字符串,元组,整型这些对象创建成功后就无法改变了。但是像列表,字典这样的可变参数改变又会如何呢。

在这里插入图片描述
在列表a中,我们发现把a的值赋给了b。当a的值改变的话,b的值也自动进行了改变。就像焦不离孟一样死死的绑定一起。其实也不难理解,打印a,b的id发现id相同。a,b变量指向的是相同的对象。当对象改变的时候,变量的值自然而然的改变。

我们如果对b进行操作,a的值也会进行改变。
在这里插入图片描述

浅拷贝

这种行为我们可以理解,但是具体在使用的时候可能会出现问题。我们如何来解决这种问题,或者是摆脱这种依赖呢,就需要用到copy。
在这里插入图片描述
我们通过a拷贝出来b,虽然b的值与a的值相同。但是他俩的id却并不相同,说明a和b其实是指向了两个完全不相同的对象。

这个时候我们再对a,b进行操作看是否会有影响呢。

在这里插入图片描述
很显然,我们再对a和b进行操作的时候,并不会相互影响,因为他们是不同的对象,这样是不是就解决问题了呢,我们如果有一个二阶列表。

在这里插入图片描述
我们新定义了一个二阶列表a,同时b拷贝啊。打印a,b二者的id,两者的id当然不同。我们对b进行添加值时,事实上对a也没有影响。

但是当我们进行

b[-2].append('b')

a的值也受到了影响,这是为什么呢,我们不妨打印改变的这个子列表的id
在这里插入图片描述
这时候我们发现了问题的原因了,我们使用浅拷贝,确实改变了b的id,但是b的子列表的id依然引用了a的子列表的id,那么如何解决这个问题呢。

深拷贝

这个时候我们就需要借助深拷贝了deepcopy
在这里插入图片描述
这个时候我们发现,使用深拷贝之后,不但a与b的id不同,a和b的子列表的id也不相同,这样在进行他们的操作时就不会再产生任何影响了。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值