日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python序列的增量赋值

發(fā)布時(shí)間:2025/3/20 python 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python序列的增量赋值 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

增量賦值運(yùn)算符有 += 和 *=。+= 背后的特殊方法是 __iadd__,如果一個類沒有實(shí)現(xiàn)__iadd__方法,Python 會退一步調(diào)用__add__方法。這兩個方法的區(qū)別在于,__iadd__為就地改動,不會改變原值的內(nèi)存地址,而 __add__ 方法會得到一個新對象。

考慮下面一個表達(dá)式:

a += b

如果 a 實(shí)現(xiàn)了__iadd__ 方法,a 會就地改動(內(nèi)存地址不變)。如果 a 沒有實(shí)現(xiàn) __iadd__ 方法,那么 a += b這個表達(dá)式的效果就變得跟a = a + b一樣了,生成一個新的對象賦給 a。

總體來講,可變序列一般都實(shí)現(xiàn)了 __iadd__ 方法,因此 += 是就地加法,而不可變序列根本就不支持這個操作。

*=和+= 一樣,只是背后的特殊方法為__imul__。

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書! ''' 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))

運(yùn)行結(jié)果如下:

id(a) = 1298277978824 id(a) = 1298277978824 id(c) = 1298277978696 id(c) = 1298277978632 id(d) = 1298277972872 id(d) = 1298277136616

了解了序列的增量賦值,我們來看 Leonardo Rochael 在 2013 年的 Python 巴西會議上提到的謎題:

t = (1, 2, [30, 40]) t[2] += [50, 60]

A. t 變成 (1, 2, [30, 40, 50, 60])

B. 因?yàn)?tuple 不支持對它的元素賦值,所以會拋出 TypeError 異常

C. 以上兩個都不是

D. A 和 B 都是對的

估計(jì)很多人會跟我一樣選 B,但其實(shí)答案是 D。在控制臺運(yùn)行代碼,顯示結(jié)果如下:

總結(jié):

1、對不可變序列進(jìn)行重復(fù)拼接操作的話,效率會很低,因?yàn)槊看味家陆ㄒ粋€序列,然后把原來序列中的元素復(fù)制到新的序列里,然后再追加新的元素。

2、不要把可變對象放在元組里面。

3、增量賦值不是一個原子操作,我們剛才也看到了,它雖然拋出了異常,但 t 的值還是改變了。

總結(jié)

以上是生活随笔為你收集整理的Python序列的增量赋值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。