思考分析Python運(yùn)算中?a+=b?和?a=a+b是否相等
如題,先上代碼
a+=b
>>> b = </code><code>[</code><code>0, 1, 2</code><code>]</code> <code>>>> a = b >>> a += [3] >>> b [0, 1, 2, 3] >>> a [0, 1, 2, 3]
此時(shí)a和b的結(jié)果是一樣的
再看
a=a+b
>>> b = [0, 1, 2] >>> a = b >>> a = a + [3] >>> b [0, 1, 2] >>> a [0, 1, 2, 3]
a不等于b
顯然,兩者是有區(qū)別的,而且這種區(qū)別只出現(xiàn)在可變對(duì)象(為什么是可變對(duì)象后面再說(shuō)),是什么原因造成了兩者的區(qū)別呢?
+= 操作調(diào)用的是 __iadd__方法,如果對(duì)象沒(méi)有該方法時(shí),再嘗試去調(diào)用__add__方法
a = [0, 1, 2] a += [3] # 等價(jià)于 a=a.__iadd__([3]) print(a) #[0, 1, 2, 3]
__iadd__方法直接在原對(duì)象a上進(jìn)行更新,對(duì)于list來(lái)說(shuō),iadd返回self,最后是需要做一次看上去多余的賦值,因?yàn)閜ython編譯器在編譯的時(shí)候并不知道a是什么類型,統(tǒng)一編譯成這樣兼容可變和不可變類型。
+ 操作調(diào)用__add__方法
a = [0, 1, 2] a += [3] # 等價(jià)于 a=a.__iadd__([3]) print(a) #[0, 1, 2, 3]
__add__方法會(huì)返回一個(gè)新的對(duì)象,原對(duì)象不修改,因?yàn)檫@里 a被重新賦值了,a指向了一個(gè)新的對(duì)象,而b還是指向原來(lái)對(duì)象,所以出現(xiàn)了文章開(kāi)頭a不等于b的情況
a = [0, 1, 2] print(a.__add__([3])) # [0, 1, 2, 3] print(a) # [0, 1, 2]
為什么前面我說(shuō)這種差異只會(huì)發(fā)生的可變對(duì)象身上?因?yàn)閷?duì)于不可變對(duì)象,根本沒(méi)有 __iadd__方法,所以+=和+的效果是一樣的,調(diào)的都是 __add__ 方法。
內(nèi)置對(duì)象中,常見(jiàn)的不可變對(duì)象和可變對(duì)象有哪些呢?這種事情ChatGPT很擅長(zhǎng)回答。

ChatGPT除了給你列出表格,還會(huì)給你解釋什么是可變對(duì)象和不可變對(duì)象
可變對(duì)象是指創(chuàng)建后可以被修改的對(duì)象,例如列表、字典和集合等,這些對(duì)象可以增加、刪除、修改其中的元素。而不可變對(duì)象則是創(chuàng)建后不能被修改的對(duì)象,例如數(shù)字、字符串、元組和布爾值等,這些對(duì)象在創(chuàng)建后不能被修改。
需要注意的是,Python 中的一些不可變對(duì)象,例如元組和命名元組,可以包含可變對(duì)象,例如列表和字典。這意味著雖然元組本身是不可變的,但是元組中包含的可變對(duì)象可以被修改。此外,Python 中還有一些特殊的對(duì)象,例如 frozenset,它是一種不可變的集合,不能被修改。
ChaGPT絕對(duì)算是一個(gè)不折不扣的輔助編程神器
AI不會(huì)讓你失業(yè),會(huì)用AI的人才會(huì)讓你失業(yè),ChatGPT不會(huì)淘汰你,能先駕馭ChatGPT的人會(huì)淘汰你。
以上就是Python運(yùn)算中 a+=b 和 a=a+b是否一樣原理的思考分析詳細(xì)內(nèi)容,更多關(guān)于Python 運(yùn)算的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python爬蟲(chóng)之requests基礎(chǔ)用法詳解
這篇文章主要介紹了Python爬蟲(chóng)之requests基礎(chǔ)用法詳解,雖然Python的標(biāo)準(zhǔn)庫(kù)中urllib模塊已經(jīng)包含了平常我們使用的大多數(shù)功能,但是它的API使用起來(lái)讓人感覺(jué)不太友好,而requests庫(kù)使用更簡(jiǎn)潔方便,需要的朋友可以參考下2023-10-10
Python通過(guò)paramiko庫(kù)實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令的方法
這篇文章主要介紹了Python通過(guò)paramiko庫(kù)實(shí)現(xiàn)遠(yuǎn)程執(zhí)行l(wèi)inux命令,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
pytorch如何利用ResNet18進(jìn)行手寫(xiě)數(shù)字識(shí)別
這篇文章主要介紹了pytorch如何利用ResNet18進(jìn)行手寫(xiě)數(shù)字識(shí)別問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
解決Pandas to_json()中文亂碼,轉(zhuǎn)化為json數(shù)組的問(wèn)題
今天小編就為大家分享一篇解決Pandas to_json() 中文亂碼,轉(zhuǎn)化為json數(shù)組的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Pycharm安裝第三方庫(kù)時(shí)Non-zero exit code錯(cuò)誤解決辦法
這篇文章主要介紹了Pycharm安裝第三方庫(kù)時(shí)Non-zero exit code錯(cuò)誤解決辦法,最好的解決辦法可以通過(guò)“Pycharm”左下角的“Terminal”,在pycharm內(nèi)使用pip安裝,以安裝“requests”為例,需要的朋友可以參考下2023-01-01
詳解分布式任務(wù)隊(duì)列Celery使用說(shuō)明
這篇文章主要介紹了詳解分布式任務(wù)隊(duì)列Celery使用說(shuō)明,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Python multiprocessing模塊中的Pipe管道使用實(shí)例
這篇文章主要介紹了Python multiprocessing模塊中的Pipe管道使用實(shí)例,本文直接給出使用實(shí)例,需要的朋友可以參考下2015-04-04

