關於python中的增量賦值的理解


增量賦值運算符 += 和 *= 的表現取決於它們的第一個操作對象

  • += 操作首先會嘗試調用對象的 __ 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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM