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]
>>> 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]
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询