Python教程:序列的增量赋值
增量賦值運算符有 += 和 *=。+= 背后的特殊方法是 __iadd__,如果一個類沒有實現 __iadd__方法,Python 會退一步調用 __add__方法。這兩個方法的區別在于,__iadd__為就地改動,不會改變原值的內存地址,而 __add__方法會得到一個新對象。
考慮下面一個表達式:
a += b如果 a 實現了__iadd__ 方法,a 會就地改動(內存地址不變)。如果 a 沒有實現__iadd__方法,那么 a += b 這個表達式的效果就變得跟 a = a + b 一樣了,生成一個新的對象賦給 a。
總體來講,可變序列一般都實現了__iadd__ 方法,因此 += 是就地加法,而不可變序列根本就不支持這個操作。
*=和 += 一樣,只是背后的特殊方法為__imul__。
a = [1, 2, 3] b = [4, 5, 6] print("id(a) = %d" % id(a)) a += b print("id(a) = %d" % id(a))c = [1, 2, 3] print("id(c) = %d" % id(c)) c = c + b print("id(c) = %d" % id(c))d = (1, 2, 3) print("id(d) = %d" % id(d)) d *= 2 print("id(d) = %d" % id(d))運行結果如下:
id(a) = 1298277978824 id(a) = 1298277978824 id(c) = 1298277978696 id(c) = 1298277978632 id(d) = 1298277972872 id(d) = 1298277136616了解了序列的增量賦值,我們來看 Leonardo Rochael 在 2013 年的 Python 巴西會議上提到的謎題:
''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:725638078 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' t = (1, 2, [30, 40]) t[2] += [50, 60]A. t 變成 (1, 2, [30, 40, 50, 60])
B. 因為 tuple 不支持對它的元素賦值,所以會拋出 TypeError 異常
C. 以上兩個都不是
D. A 和 B 都是對的
估計很多人會跟我一樣選 B,但其實答案是 D。
在控制臺運行代碼,顯示結果如下:
總結:
1、對不可變序列進行重復拼接操作的話,效率會很低,因為每次都要新建一個序列,然后把原來序列中的元素復制到新的序列里,然后再追加新的元素。
2、不要把可變對象放在元組里面。
3、增量賦值不是一個原子操作,我們剛才也看到了,它雖然拋出了異常,但 t 的值還是改變了。
總結
以上是生活随笔為你收集整理的Python教程:序列的增量赋值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python教程:zip 函数的用法
- 下一篇: 介绍一下python有趣的库-tqdm