如 *= +=
對於可變序列,如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 會新建乙個包含同樣類 型資料的序列來作為拼接的結果。如果想要把乙個序列複製幾份然後再拼接起來,更快捷的做法是把這個序列乘以乙個整 數。同樣,這...