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