欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Python中表達式i+=x與i=i+x是不是一樣的

這篇文章主要介紹Python中表達式i += x與 i = i + x是不是一樣的,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯建站長期為上1000家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態(tài)環(huán)境。為北戴河企業(yè)提供專業(yè)的網站設計制作、成都網站建設,北戴河網站改版等技術服務。擁有十年豐富建站經驗和眾多成功案例,為您定制開發(fā)。

Python 表達式 i += xi = i + x等價嗎?如果你的回答是yes,那么恭喜你正確了50%,為什么說只對了一半呢? 按照我們的一般理解它們倆是等價的,整數操作時兩者沒什么異同,但是對于列表操作,是不是也一樣呢?先看下面兩段代碼:

代碼1

>>> l1 = range(3)
>>> l2 = l1
>>> l2 += [3]
>>> l1
[0, 1, 2, 3]
>>> l2
[0, 1, 2, 3]

代碼2

>>> l1 = range(3)
>>> l2 = l1
>>> l2 = l2 + [3]
>>> l1
[0, 1, 2]
>>> l2
[0, 1, 2, 3]

代碼1與代碼2中的l2的值是一樣的,但是l1的值卻不一樣,說明 i += xi = i + x 是不等價的,那什么情況下等價,什么情況下不等價呢?

弄清楚這個問題之前,首選得明白兩個概念:可變對象與不可變對象。

在 Python 中任何對象都有的三個通用屬性:唯一標識、類型、值。

唯一標識:用于標識對象的在內存中唯一性,它在對象創(chuàng)建之后就不會再改變,函數 id()可以查看對象的唯一標識

類型:決定了該對象支持哪些操作,不同類型的對象支持的操作就不一樣,比如列表可以有l(wèi)ength屬性,而整數沒有。同樣地對象的類型一旦確定了就不會再變,函數 type()可以返回對象的類型信息。

對象的與唯一標識不一樣,并不是所有的對象的值都是一成不變的,有些對象的值可以通過某些操作發(fā)生改變,值可以變化的對象稱之為可變對象(mutable),值不能改變的對象稱之為不可變對象(immutable)

不可變對象(immutable)

對于不可變對象,值永遠是剛開始創(chuàng)建時候的值,對該對象做的任何操作都會導致一個新的對象的創(chuàng)建。

>>> a = 1
>>> id(a)
32574568
>>> a += 1
>>> id(a)
32574544

整數 “1” 是一個不可變對象,最初賦值的時候,a 指向的是整數對象 1 ,但對變量a執(zhí)行 += 操作后, a 指向另外一個整數對象 2 ,但對象 1 還是在那里沒有發(fā)生任何變化,而 變量 a 已經指向了一個新的對象2。常見的不可變對象有:int、tuple、set、str。

Python中表達式i += x與 i = i + x是不是一樣的

可變對象(mutable)

可變對象的值可以通過某些操作動態(tài)的改變,比如列表對象,可以通過append方法不斷地往列表中添加元素,該列表的值就在不斷的處于變化中,一個可變對象賦值給兩個變量時,他們共享同一個實例對象,指向相同的內存地址,對其中任何一個變量操作時,同時也會影響另外一個變量。

>>> x = range(3)
>>> y = x

>>> id(x)
139726103041232
>>> id(y)
139726103041232

>>> x.append(3)
>>> x
[0, 1, 2, 3]
>>> y
[0, 1, 2, 3]

>>> id(x)
139726103041232
>>> id(y)
139726103041232

Python中表達式i += x與 i = i + x是不是一樣的

執(zhí)行append操作后,對象的內存地址不會改變,x、y 依然指向的是原來同一個對象,只不過是他的值發(fā)生了變化而已。

Python中表達式i += x與 i = i + x是不是一樣的

理解完可變對象與不可變對象后,回到問題本身,+=+的區(qū)別在哪里呢?

+= 操作首先會嘗試調用對象的 __iadd__方法,如果沒有該方法,那么嘗試調用__add__方法,先來看看這兩個方法有什么區(qū)別

__add__和 __iadd__ 的區(qū)別

  • __add__ 方法接收兩個參數,返回它們的和,兩個參數的值均不會改變。

  • __iadd__ 方法同樣接收兩個參數,但它是屬于 in-place 操作,就是說它會改變第一個參數的值,因為這需要對象是可變的,所以對于不可變對象沒有__iadd__方法。

>>> hasattr(int, '__iadd__')
False
>>> hasattr(list, '__iadd__')
True

顯然,整數對象是沒有__iadd__的,而列表對象提供了__iadd__方法。

>>> l2 += [3]  # 代碼1:使用__iadd__,l2的值原地修改

代碼1中的 += 操作調用的是__iadd__方法,他會原地修改l2指向的那個對象本身的值

Python中表達式i += x與 i = i + x是不是一樣的

>>> l2 = l2 + [3]  # 代碼2:調用 __add__,創(chuàng)建了一個新的列表,賦值給了l2

而代碼2中的 + 操作調用的是 __add__ 方法,該方法會返回一個新的對象,原來的對象保持不變,l1還是指向原來的對象,而l2已經指向一個新的對象。

Python中表達式i += x與 i = i + x是不是一樣的

以上是“Python中表達式i += x與 i = i + x是不是一樣的”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯行業(yè)資訊頻道!

本文標題:Python中表達式i+=x與i=i+x是不是一樣的
網站地址:http://chinadenli.net/article38/ppcdsp.html

成都網站建設公司_創(chuàng)新互聯,為您提供App設計、ChatGPT、品牌網站設計域名注冊、軟件開發(fā)、動態(tài)網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都app開發(fā)公司
国产白丝粉嫩av在线免费观看| 国产成人精品在线一区二区三区| 亚洲国产综合久久天堂| 在线观看视频成人午夜| 亚洲一区二区三区在线中文字幕| 日本欧美三级中文字幕| 久久精品少妇内射毛片| 日本午夜福利视频免费观看| 最新国产欧美精品91| 国产一区二区三区草莓av| 人妻内射在线二区一区| 中文字幕有码视频熟女| 少妇一区二区三区精品| 白丝美女被插入视频在线观看| 日韩黄片大全免费在线看| 九九热在线视频精品免费| 欧美人妻免费一区二区三区 | 狠狠做深爱婷婷久久综合| 视频一区二区黄色线观看| 日本精品啪啪一区二区三区| 欧美性欧美一区二区三区| 日韩欧美三级中文字幕| 男人和女人草逼免费视频| 欧美乱妇日本乱码特黄大片| 老司机精品在线你懂的| 日韩人妻一区二区欧美| 亚洲精品一区三区三区| 美国女大兵激情豪放视频播放| 国产内射一级一片内射高清视频 | 日本东京热视频一区二区三区| 日韩一区二区三区久久| 日韩中文字幕免费在线视频 | 欧美日韩视频中文字幕| 国产不卡在线免费观看视频| 国产精品午夜福利免费阅读| 国产成人精品一区二区在线看| 欧美日韩一区二区综合| 中文字幕有码视频熟女| 亚洲黄香蕉视频免费看| 国产午夜福利不卡片在线观看| 少妇视频一区二区三区|