python中的增量赋值

**python

一,在python中a=a+b和a+=b有区别吗

**1,对可变的数据类型web

a=[1,2,3]
print(id(a))    #1602469350792
b=[4,5]
a=a+b
print(a,id(a))      #[1, 2, 3, 4, 5] 1602469421512

a=[1,2,3]
print(id(a))    #1736417136008
b=[4,5]
a += b
print(a,id(a))  #[1, 2, 3, 4, 5] 1736417136008

对可变数据类型,a= a+b 和 a+=b 他们获得的新的列表的元素是一致的,可是他们的内存地址一个和原列表a的一致,一个不一致。svg

2,对不可变数据类型code

a=(1,2,3)
print(id(a))    #2352934763832
b=(3,4)
a=a+b
print(a,id(a))      #(1, 2, 3, 3, 4) 2352934103616

a=(1,2,3)
print(id(a))    #2128999628088
b=(3,4)
a+=b
print(a,id(a))      #(1, 2, 3, 3, 4) 2128998967872

对不可变数据类型,a= a+b 和 a+=b 他们获得的新的列表的元素是一致的,他们的内存地址也都和原列表不一致。xml

二,出现这样的现象的缘由

+=调用的是__iadd__方法,此方法是就地加法。
当类的内部有__iadd__方法的时候,遇到+=会优先调用此方法,没有的时候,会退而求其次,调用__add__方法。
对列表而言,a +=b就至关于a.extend(b)。内存

print("__iadd__" in dir(list))      #True
print("__add__" in dir(list))       #True
print("__iadd__" in dir(tuple))     #False
print("__add__" in dir(tuple))      #True