Python学习系列之+= 和 = +

区别 

a+=b

a=a+b

 针对于int型。

>>> a=1
>>> b=a
>>> a+=1
>>> a,b
(2, 1)
>>> a=1
>>> b=a
>>> a=a+1
>>> a,b
(2, 1)
>>> a=[1,2,3,4]
>>> b=a
>>> a+=[5]
>>> a,b
([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])

通俗地讲,类型为int时,a和b是“不一样的”;类型为list时,a和b是“一样的”。术语叫做immutable和mutable。两者是有区别的,而这种区别只出现在可变对象上,当两个对象是可变对象时,两个是有区别的;当两个对象是不可变对象时,两个没区别。是什么原因造成了两者的区别呢?

原因

+= 操作调用 __iadd__方法,没有该方法时,再尝试调用__add__方法

__iadd__方法直接在原对象a1上进行更新,该方法的返回值为None

+ 操作调用__add__方法

__add__方法会返回一个新的对象,原对象不修改,因为这里 a1被重新赋值了,a1指向了一个新的对象,所以出现了文章开头a1不等于a2的情况。

也就是在+=的情况下,a还是原来的a,和b“一样”,直接在原对象a和b上进行修改;在= +的情况下,a已经不是原来的a了,和b“不一样”。是a+b的结果产生的新对象赋值给a。

为什么前面我说这种差异只会发生的可变对象身上?因为对于不可变对象,根本没有 __iadd__方法,所以+=和+的效果是一样的,因为调的都是 __add__ 方法。

注意

b=copy.deepcopy(a)才是进行我们通常期望的“拷贝”。类似于java的clone()函数。

copy.copy和copy.deepcopy还是有区别的,请看相关文章。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值