分析序列的增量賦值 ,

2021-08-03 10:16:24 字數 965 閱讀 6099

如 *=   +=

對於可變序列,如list,bytearrary和array.aray(實現了__iadd__, __imul__,就地運算),增量運算後,新元素追加到可變序列後,該序列的id不變

對於不可變序列,沒有實現上述方法,就需要建立個新物件,然後賦值,如a+=b,相當於a=a+b

例子:>>> l=[1,2,3]

>>> id(l)

47410632218312

>>> l*=2

>>> id(l)

47410632218312

>>> l

[1, 2, 3, 1, 2, 3]

>>> t=(1,2,3)

>>> id(t)

47410559333872

>>> t*=3

>>> id(t)

47410627604688

>>> t

(1, 2, 3, 1, 2, 3, 1, 2, 3)

對不可變序列進行重複拼接操作的話,效率會很低,因為每次都要新建立乙個物件,直譯器需要把原來物件中的元素先複製到新的物件裡,然後再追加新的元素。

str 是個例外,因為對字串做+=太普遍,所以cpython對它進行了優化。為str初始化記憶體的時候,程式會為它留出額外的可擴充套件空間,因此增量操作的時候,並不會涉及複製原有字串到新物件的操作。

增量賦值不是乙個原子操作,例子如下,雖然會報錯,但還是完成了操作:

>>> t

(1, 2, [10, 20])

>>> t[2]+=[30,40]

traceback (most recent call last):

file "", line 1, in

typeerror: 'tuple' object does not support item assignment

>>> t

(1, 2, [10, 20, 30, 40])

Python序列的增量賦值 和

增量賦值運算子 和 的表現取決於它們第乙個的操作物件。例如 背後的特殊方法是 iadd 用於就地加法 但是如果乙個序列沒有實現這個方法,python會退一步呼叫 add 以 a b為例 如果a實現了 iadd 方法,就會呼叫這個方法。同時對於可變序列 例如list 來說,a就會就地改動,就行呼叫了a...

python中的增量賦值

1,對可變的資料型別 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...

Python學習筆記 序列賦值

python 程式設計師會預設序列是支援 和 操作的。通常 號兩側的序列由相同型別的資料所 構成,在拼接的過程中,兩個被操作的序列都不會被修改,python 會新建乙個包含同樣類 型資料的序列來作為拼接的結果。如果想要把乙個序列複製幾份然後再拼接起來,更快捷的做法是把這個序列乘以乙個整 數。同樣,這...