Python 表達(dá)式i += x與i = i + x等價(jià)嗎?如果你的回答是yes,那么恭喜你正確了50%,為什么說(shuō)只對(duì)了一半呢? 按照我們的一般理解它們倆是等價(jià)的,整數(shù)操作時(shí)兩者沒(méi)什么異同,但是對(duì)于列表操作,是不是也一樣呢?先看下面兩段代碼:
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),尼瑪企業(yè)網(wǎng)站建設(shè),尼瑪品牌網(wǎng)站建設(shè),網(wǎng)站定制,尼瑪網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,尼瑪網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。代碼1

代碼2

代碼1與代碼2中的l2的值是一樣的,但是l1的值卻不一樣,說(shuō)明i += x與i = i + x是不等價(jià)的,那什么情況下等價(jià),什么情況下不等價(jià)呢?
弄清楚這個(gè)問(wèn)題之前,選得明白兩個(gè)概念:可變對(duì)象與不可變對(duì)象。
在 Python 中任何對(duì)象都有的三個(gè)通用屬性:唯一標(biāo)識(shí)、類(lèi)型、值。
唯一標(biāo)識(shí):用于標(biāo)識(shí)對(duì)象的在內(nèi)存中唯一性,它在對(duì)象創(chuàng)建之后就不會(huì)再改變,函數(shù)id()可以查看對(duì)象的唯一標(biāo)識(shí)
類(lèi)型:決定了該對(duì)象支持哪些操作,不同類(lèi)型的對(duì)象支持的操作就不一樣,比如列表可以有l(wèi)ength屬性,而整數(shù)沒(méi)有。同樣地對(duì)象的類(lèi)型一旦確定了就不會(huì)再變,函數(shù)type()可以返回對(duì)象的類(lèi)型信息。
對(duì)象的值與唯一標(biāo)識(shí)不一樣,并不是所有的對(duì)象的值都是一成不變的,有些對(duì)象的值可以通過(guò)某些操作發(fā)生改變,值可以變化的對(duì)象稱(chēng)之為可變對(duì)象(mutable),值不能改變的對(duì)象稱(chēng)之為不可變對(duì)象(immutable)
不可變對(duì)象(immutable)
對(duì)于不可變對(duì)象,值永遠(yuǎn)是剛開(kāi)始創(chuàng)建時(shí)候的值,對(duì)該對(duì)象做的任何操作都會(huì)導(dǎo)致一個(gè)新的對(duì)象的創(chuàng)建。

整數(shù) “1” 是一個(gè)不可變對(duì)象,最初賦值的時(shí)候,a指向的是整數(shù)對(duì)象 1 ,但對(duì)變量a執(zhí)行+=操作后, a 指向另外一個(gè)整數(shù)對(duì)象 2 ,但對(duì)象 1 還是在那里沒(méi)有發(fā)生任何變化,而 變量 a 已經(jīng)指向了一個(gè)新的對(duì)象2。常見(jiàn)的不可變對(duì)象有:int、tuple、set、str。
可變對(duì)象(mutable)
可變對(duì)象的值可以通過(guò)某些操作動(dòng)態(tài)的改變,比如列表對(duì)象,可以通過(guò)append方法不斷地往列表中添加元素,該列表的值就在不斷的處于變化中,一個(gè)可變對(duì)象賦值給兩個(gè)變量時(shí),他們共享同一個(gè)實(shí)例對(duì)象,指向相同的內(nèi)存地址,對(duì)其中任何一個(gè)變量操作時(shí),同時(shí)也會(huì)影響另外一個(gè)變量。

執(zhí)行append操作后,對(duì)象的內(nèi)存地址不會(huì)改變,x、y 依然指向的是原來(lái)同一個(gè)對(duì)象,只不過(guò)是他的值發(fā)生了變化而已。
理解完可變對(duì)象與不可變對(duì)象后,回到問(wèn)題本身,+=與+的區(qū)別在哪里呢?
+= 操作首先會(huì)嘗試調(diào)用對(duì)象的 __iadd__方法,如果沒(méi)有該方法,那么嘗試調(diào)用__add__方法,先來(lái)看看這兩個(gè)方法有什么區(qū)別
__add__和__iadd__的區(qū)別
__add__ 方法接收兩個(gè)參數(shù),返回它們的和,兩個(gè)參數(shù)的值均不會(huì)改變。
__iadd__ 方法同樣接收兩個(gè)參數(shù),但它是屬于 in-place 操作,就是說(shuō)它會(huì)改變第一個(gè)參數(shù)的值,因?yàn)檫@需要對(duì)象是可變的,所以對(duì)于不可變對(duì)象沒(méi)有__iadd__方法。

顯然,整數(shù)對(duì)象是沒(méi)有__iadd__的,而列表對(duì)象提供了__iadd__方法。
>>> l2 += [3]#代碼1:使用__iadd__,l2的值原地修改
代碼1中的 += 操作調(diào)用的是__iadd__方法,他會(huì)原地修改l2指向的那個(gè)對(duì)象本身的值
>>> l2 = l2 + [3]# 代碼2:調(diào)用 __add__,創(chuàng)建了一個(gè)新的列表,賦值給了l2
而代碼2中的 + 操作調(diào)用的是 __add__方法,該方法會(huì)返回一個(gè)新的對(duì)象,原來(lái)的對(duì)象保持不變,l1還是指向原來(lái)的對(duì)象,而l2已經(jīng)指向一個(gè)新的對(duì)象。
以上就是表達(dá)式 i += x 與 i = i + x 的區(qū)別。因此對(duì)于列表進(jìn)行 += 操作時(shí),會(huì)存在潛在的bug,因?yàn)閘1會(huì)因?yàn)閘2的變化而發(fā)生改變,就像函數(shù)的參數(shù)不宜使用可變對(duì)象作為關(guān)鍵字參數(shù)一樣。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
標(biāo)題名稱(chēng):Python:表達(dá)式i+=x與i=i+x等價(jià)嗎?-創(chuàng)新互聯(lián)
URL標(biāo)題:http://www.yijiale78.com/article24/cegdje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、靜態(tài)網(wǎng)站、面包屑導(dǎo)航、手機(jī)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容