Python 中 a+=b 和 a=a+b 的区别有哪些
答案:1 悬赏:0 手机版
解决时间 2021-04-07 10:32
- 提问者网友:兔牙战士
- 2021-04-06 22:18
Python 中 a+=b 和 a=a+b 的区别有哪些
最佳答案
- 五星知识达人网友:第幾種人
- 2021-04-06 23:55
a+=b
>>> a1 = range(3)
>>> a2 = a1
>>> a2 += [3]
>>> a1
[0, 1, 2, 3]
>>> a2
[0, 1, 2, 3]
a=a+b
>>> a1 = range(3)
>>> a2 = a1
>>> a2 = a2 + [3]
>>> a1
[0, 1, 2]
>>> a2
[0, 1, 2, 3]
显然,两者是有区别的,而这种区别只出现在可变对象上(为什么是可变对象后面再说),是什么原因造成了两者的区别呢?
+= 操作调用 __iadd__方法,没有该方法时,再尝试调用__add__方法
a1 = [0, 1, 2]
a1 += [3]
# 等价于
a1.__iadd__([3])
print(a1) #[0, 1, 2, 3]
__iadd__方法直接在原对象a1上进行更新,该方法的返回值为None
+ 操作调用__add__方法
a1 = [0, 1, 2]
a1 = a1 + [3]
# 等价于
a1 = a1.__add__([3])
__add__方法会返回一个新的对象,原对象不修改,因为这里 a1被重新赋值了,a1指向了一个新的对象,所以出现了文章开头a1不等于a2的情况
a1 = [0, 1, 2]
print(a1.__add__([3])) # [0, 1, 2, 3]
print(a1) # [0, 1, 2]
>>> a1 = range(3)
>>> a2 = a1
>>> a2 += [3]
>>> a1
[0, 1, 2, 3]
>>> a2
[0, 1, 2, 3]
a=a+b
>>> a1 = range(3)
>>> a2 = a1
>>> a2 = a2 + [3]
>>> a1
[0, 1, 2]
>>> a2
[0, 1, 2, 3]
显然,两者是有区别的,而这种区别只出现在可变对象上(为什么是可变对象后面再说),是什么原因造成了两者的区别呢?
+= 操作调用 __iadd__方法,没有该方法时,再尝试调用__add__方法
a1 = [0, 1, 2]
a1 += [3]
# 等价于
a1.__iadd__([3])
print(a1) #[0, 1, 2, 3]
__iadd__方法直接在原对象a1上进行更新,该方法的返回值为None
+ 操作调用__add__方法
a1 = [0, 1, 2]
a1 = a1 + [3]
# 等价于
a1 = a1.__add__([3])
__add__方法会返回一个新的对象,原对象不修改,因为这里 a1被重新赋值了,a1指向了一个新的对象,所以出现了文章开头a1不等于a2的情况
a1 = [0, 1, 2]
print(a1.__add__([3])) # [0, 1, 2, 3]
print(a1) # [0, 1, 2]
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯