增量賦值運算符 += 和 = 的表現取決於它們的第一個操作對象 += 操作首先會嘗試調用對象的 __ iadd__方法,如果沒有該方法,那麼嘗試調用__add__方法,所以+= 與 + 的區別實質是__iadd__ 與 __add__的區別,同理, = 操作首先會嘗試調用對象的__imul__方法, ...
增量賦值運算符 += 和 *= 的表現取決於它們的第一個操作對象
+= 操作首先會嘗試調用對象的 __ iadd__方法,如果沒有該方法,那麼嘗試調用__add__方法,所以+= 與 + 的區別實質是iadd 與 __add__的區別,同理,
*= 操作首先會嘗試調用對象的__imul__方法,如果沒有該方法,那麼嘗試調用__mul__方法。
_ add_ 和 _ iadd_ 的區別
- _ add_ 方法接收兩個參數,返回它們的和,兩個參數的值均不會改變。
- _ iadd_ 方法同樣接收兩個參數,但它是屬於 in-place 操作,就是說它會改變第一個參數的值,因為這需要對象是可變的,所以對於不可變對象沒有__iadd__方法。
hasattr(int,'__iadd__') // False
hasattr(list,'__iadd__) // True
顯然,整數對象是沒有__ iadd__的,而列表對象提供了__iadd__方法。
不可變類型對象 數字
a = 123
id(a)
>>> 1688042320
a += 123
id(a)
>>> 246
>>> 1688046256
a *= 2
id(a)
>>> 492
>>> 1688052012
可變類型對象的列表
L = [1,2,3]
id(L)
>>> 4311953800
L *= 2
>>> [1,2,3,1,2,3]
id(L)
>>> 4311953800
___________________________
t = (1,2,3)
id(t)
>>> 4312681568
t *= 2
id(t)
>>> 4301348296
L1 = range(3)
L2 = L1
L1 = L1 + [3]
PS:遇到問題沒人解答?需要Python學習資料?可以加點擊下方鏈接自行獲取
note.youdao.com/noteshare?id=2dce86d0c2588ae7c0a88bee34324d76
+操作調用的是 _ add_ 方法,該方法會返回一個新的對象,原來的對象保持不變,l1還是指向原來的對象,而l2已經指向一個新的對象。
L1 = range(3)
L2 = L1
L1 += [3]
+= 操作調用的是__iadd__方法,他會原地修改l2指向的那個對象本身的值
一道關於 += 的謎題
t = (1,2,[3,4],7)
t[2].append(5)
>>> (1,2,[3,4,5],7)
t[2] += [6]
>>> Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
t
>>> (1,2,[3,4,5,6],7)