python小白 問(wèn)關(guān)于a+=a 和a=a+a的區(qū)別
問(wèn)題描述
第一段代碼:
# -*- coding:gb2312 -*-a = [100]def test(num): num += num #第一段代碼 print(num) test(a)print(a)
執(zhí)行結(jié)果:
第二段代碼:
# -*- coding:gb2312 -*-a = [100]def test(num): num = num + num #這個(gè)地方改了一下 print(num) test(a)print(a)
執(zhí)行結(jié)果:
我的問(wèn)題:num += num不應(yīng)該直接等價(jià)于mun = num+num 么為什么算出來(lái)結(jié)果卻是不一樣的?這個(gè)是什么情況
問(wèn)題解答
回答1:你可以嘗試進(jìn)行這樣的操作,
In [1]: a = [100]In [2]: b = [100]In [3]: id(a)Out[3]: 79308552LIn [4]: id(b)Out[4]: 79342728LIn [5]: a += aIn [6]: b = b + bIn [7]: id(a)Out[7]: 79308552LIn [8]: id(b)Out[8]: 79341192L
通過(guò)id()這個(gè)函數(shù)可以得到變量所分配的內(nèi)存地址。通過(guò)實(shí)驗(yàn)發(fā)現(xiàn)使用了+的變量地址發(fā)生了變化,也就是你所說(shuō)的num+=num與num=num+num不等價(jià)。但是,當(dāng)做如下騷操作時(shí)候又會(huì)發(fā)現(xiàn)啪啪啪打臉
In [19]: a = (0,)In [20]: b = (0,)In [21]: id(a)Out[21]: 82230688LIn [22]: id(b)Out[22]: 82208920LIn [23]: a += aIn [24]: b = b + bIn [25]: id(a)Out[25]: 79268296LIn [26]: id(b)Out[26]: 79328392L
分配的地址似乎一直在改變。原因在于,Python中的數(shù)據(jù)結(jié)構(gòu)分為可變(mutable)和不可變(immutable)。對(duì)于可變類(lèi)型,=和+=有著明顯的不同,如上面的list:+表示連接操作,+=表示追加對(duì)于不可變類(lèi)型,=和+=就是一樣的操作,如上面的tuple可變類(lèi)型與不可變類(lèi)型的本質(zhì)在于內(nèi)存空間是否可變~
回答2:首先看出區(qū)別在于
In [26]: def test(num): ...: num = num + num ...: print (num) ...:In [27]: def test1(num): ...: num += num ...: print (num) ...:In [28]: import disIn [29]: dis.dis(test) 2 0 LOAD_FAST0 (num) 3 LOAD_FAST0 (num) 6 BINARY_ADD #區(qū)別在這兒 7 STORE_FAST 0 (num) 3 10 LOAD_FAST0 (num) 13 PRINT_ITEM 14 PRINT_NEWLINE 15 LOAD_CONST 0 (None) 18 RETURN_VALUEIn [30]: dis.dis(test1) 2 0 LOAD_FAST0 (num) 3 LOAD_FAST0 (num) 6 INPLACE_ADD #看這兒 7 STORE_FAST 0 (num) 3 10 LOAD_FAST0 (num) 13 PRINT_ITEM 14 PRINT_NEWLINE 15 LOAD_CONST 0 (None) 18 RETURN_VALUE
可以看出分別調(diào)用的方法不同,分別是__add__,__iadd__加法運(yùn)算符會(huì)計(jì)算出新的object來(lái)賦值給num增量賦值運(yùn)算符修改原來(lái)的引用
參考這兒: https://stackoverflow.com/que...
回答3:Remember that arguments are passed by assignment in Python.
傳參數(shù)在python是用assignment 不是reference,所以你傳a過(guò)去函數(shù)時(shí)傳的是a的值,而不是a本身。若你要改動(dòng)a本身就需要用return傳值回來(lái)
a = [100]def test(num): num = num + num #這個(gè)地方改了一下 return(num) #這個(gè)地方再改了一下 print(test(a)) #傳值回來(lái)print(a)a = test(a)print(a)
結(jié)果:
[100, 100][100][100, 100]回答4:
在python中,a=a+b是先創(chuàng)建一個(gè)新的對(duì)象并讓變量a引用這個(gè)對(duì)象,a+=b是讓a所引用的對(duì)象的值變成a+b的值
相關(guān)文章:
1. 在mybatis使用mysql的ON DUPLICATE KEY UPDATE語(yǔ)法實(shí)現(xiàn)存在即更新應(yīng)該使用哪個(gè)標(biāo)簽?2. mysql - 怎么生成這個(gè)sql表?3. mysql儲(chǔ)存json錯(cuò)誤4. 哭遼 求大佬解答 控制器的join方法怎么轉(zhuǎn)模型方法5. mysql - 表名稱(chēng)前綴到底有啥用?6. Navicat for mysql 中以json格式儲(chǔ)存的數(shù)據(jù)存在大量反斜杠,如何去除?7. 編輯成功不顯示彈窗8. 怎么php怎么通過(guò)數(shù)組顯示sql查詢(xún)結(jié)果呢,查詢(xún)結(jié)果有多條,如圖。9. mysql - 數(shù)據(jù)庫(kù)表中,兩個(gè)表互為外鍵參考如何解決10. sql語(yǔ)句 - 如何在mysql中批量添加用戶(hù)?
