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

歡迎訪問 生活随笔!

生活随笔

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

python

Python中的+=

發(fā)布時間:2024/8/23 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中的+= 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

引出

今天在運行之前寫的一個Python腳本時,發(fā)生了一個奇怪的現(xiàn)象(我怎么老遇到奇怪的現(xiàn)象~~)。當(dāng)時的代碼大概長這樣:

a = [1, 2, 3] b = [4, 5, 6] # ...一大段邏輯 c = a c += b # ...一大段邏輯 # 在這里,a變成了[1, 2, 3, 4, 5, 6]

首先,上面的代碼一個函數(shù)過于長了,實在不像話

當(dāng)時的情景是這樣的,程序并沒有想我預(yù)期中一樣運行。我找了半天,沒有找到對a變量的修改或賦值操作。

最終,發(fā)現(xiàn)了藏在中間的c變量,因為是列表對象的引用賦值,所以直接修改了a變量。我將兩個變量的地址打印出來,確實是這樣的。

本來,查到這里基本上破案了。也應(yīng)該沒有后續(xù)了

但我上網(wǎng)查了一下,有人說用 =+就不會出現(xiàn)這種情況,我輕蔑的笑了,有什么區(qū)別么?不信邪的我試了一下。

What?誰能告訴我發(fā)生了什么?

探究

根據(jù)我的推測,必然是+=操作改變的是原對象,=+操作返回了新的對象。嘗試一下:

果不其然。在此破案。

解惑

都知道Python的運算符重載操作,加法調(diào)用的是__add__方法,+=調(diào)用的是__iadd__方法。既然產(chǎn)生這個現(xiàn)象,那一定是list對兩個方法的實現(xiàn)不同咯。

嘗試自己動手測試,寫一個Test類,實現(xiàn)兩個重載方法:

分別調(diào)用+=和=+:

可以看到,都是新的值。如果修改一下方法的實現(xiàn):

再測試就會發(fā)下,兩個運算返回的都是同一個對象。水落石出,Python對兩個不同的運算符使用了不同的實現(xiàn)方法。

一探究竟

那為什么Python會在 +=操作時,直接修改原對象。而=+操作卻要返回新的對象呢?

簡單推測一下,可能Python的作者認(rèn)為,+=操作是要將后邊的值加到自身上。而+則是兩個值的運算操作。根據(jù)表達(dá)是也可以看出:

a += b # 這里只涉及兩個變量,將b的內(nèi)容直接加到a上 c = a + b # 這里涉及到了三個變量,將后兩者內(nèi)容相加后賦值給新的變量

最后,既然+=和=+的實現(xiàn)不同,那么同理列表的-=和=-、*=和=*、/=和=/的實現(xiàn)也必然不同。

哦,不好意思,list沒有實現(xiàn)減法和除法的操作。但乘法確實也是這樣。

好吧,之后再進行對象運算符重載時可以參考一下上面的做法,仔細(xì)想想還是很合乎邏輯的。

總結(jié)

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

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