Python中的赋值与拷贝

在经过多次尝试之后,终于基本弄清了python中的拷贝和赋值的原理,总体来说,个人觉得不像C++那么讲道理,但并不是无章可循。

首先,最重要的是赋值的原理,也是能解释下面所有内容的关键:b=a的含义是将a指向的变量的地址复制给b。当变量是一个值,b就会指向这个值的地址;当a指向的变量是一个列表、元组或者字典,b就指向列表、元组或者字典的地址。

问题变的清楚了,看下面的代码:

a = 1
b = a
a = 2
b
a = [1,2]
b = a
a.append(3)
b

输出分别为:

1
[1,2,3]
很明显,a=2使得 a指向了2的地址(即a指向了一个新的地址),所以b的值并没有受到影响。

但a=[1,2],b=a后,b和a指向了同一个列表的地址,并没有指向列表的所有元素,因此修改a的列表元素后,b相应的也会发生变化。

为了保证a和b列表间不会相互影响,这里首先引入浅拷贝的概念:

a=[1,2]
b = a.copy()
a.append(3)
b

对应输出为:

[1,2]

浅拷贝原理是开辟一个新的空间,将a指向的变量拷贝到新空间,让b指向这个新空间的变量。但是这里仍会有问题:

a = [[1,2],3]
b = a.copy()
a[0][0]=2 #a=[[2,2],3]
b

结果为:

[[2,2],3]

当a指向的变量(起个名字叫子变量)指向变量(这里就叫做孙变量吧)时,浅拷贝并不会把孙变量一并拷贝,而是拷贝了指向孙变量的子变量——指针。这样结果就很好理解了。

为了解决这个问题,需要引入深拷贝

import copy
a = [[1,2],3]
b = copy.deepcopy(a)
a[0][0]=2
b

此时的输出已经变为:

[[1,2],3]

并且经过测试,a的变量深度再加深,深拷贝结果仍然正确。

字典的情况与列表类似,我们可以认为字典的key和value分别对应两个数组即可。

利用这个性质,我们可以将类的私有字典通过=赋值的方式传递出去。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值