Python 中 a+=b 和 a=a+b 的区别有哪些

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]

注:以上的斜杠都去掉!

发布了16 篇原创文章 · 获赞 2 · 访问量 744

猜你喜欢

转载自blog.csdn.net/qq_41475583/article/details/97805678