Python中的a+=a和a=a+a的区别(认真看完后,我相信你一定会回来感谢我的)
一、先來(lái)兩段代碼!
a = 100def beyond(num):num+=numprint(num)beyond(a)#結(jié)果為:200 print(a)#結(jié)果為:100 a = 100def beyond(num):num=num+numprint(num)beyond(a)#結(jié)果為:200 print(a)#結(jié)果為:100通過(guò)這兩段代碼的結(jié)果可以看出,最終的結(jié)果和大家想的完全一樣。
但事實(shí)這兩段代碼是完全等價(jià)的嘛?答案是否定的,要是是完全一樣我寫(xiě)這篇博客閑著沒(méi)事干哈。
廢話(huà)不多說(shuō),下面進(jìn)入正題。
在Python中列表、字典是可變數(shù)據(jù)類(lèi)型;可變數(shù)據(jù)類(lèi)型在定義字典的時(shí)候是不可以當(dāng)key的,可以當(dāng)value,因?yàn)閗ey有個(gè)hash過(guò)程。
如果一個(gè)變量指向一個(gè)全局變量,那么想要修改這個(gè)全局變量,就得看下這個(gè)全局變量是不是可變數(shù)據(jù)類(lèi)型。以這兩段代碼為例,a=100,這里變量a指向全局變量100,需要修改100,得看下100這個(gè)整型數(shù)是不是可變數(shù)據(jù)類(lèi)型。很顯然,不是!
分析一下程序執(zhí)行過(guò)程:
①a = 100 #先定義一個(gè)內(nèi)存空間1存儲(chǔ)100,變量a指向這個(gè)列表1
②def beyond(num): #程序運(yùn)行到這里時(shí),系統(tǒng)已明確這個(gè)函數(shù)需要有一個(gè)參數(shù),由于Python是動(dòng)態(tài)語(yǔ)言(第四部分中有解釋),故此時(shí)尚未清楚這個(gè)函數(shù)具體實(shí)現(xiàn)的功能是什么。
③beyond(a) #這里變量a指向誰(shuí),也會(huì)將函數(shù)中形參num也指向誰(shuí),這里均指向內(nèi)存空間1
④當(dāng)程序運(yùn)行到函數(shù)beyond(num)時(shí),:
1,首先判斷能否對(duì)這個(gè)num值進(jìn)行修改,即判斷num是否是可變數(shù)據(jù)類(lèi)型;若能修改直接在num上修改
2,若不能修改則需要重新定義一個(gè)變量,讓這個(gè)變量再重新指向這個(gè)值;即系統(tǒng)會(huì)重新定義內(nèi)存空間2,用來(lái)存放num+num的值。即此時(shí)的num指向內(nèi)存空間2,內(nèi)存空間2存放num+num的值。
⑤print(num)
⑥print(a)
若為num = num + num 即先算等號(hào)右邊,會(huì)的到一個(gè)臨時(shí)的答案,得到這個(gè)臨時(shí)的答案相當(dāng)于在內(nèi)存中額外開(kāi)辟了一塊內(nèi)存;等號(hào)左邊則會(huì)指向這個(gè)額外開(kāi)辟內(nèi)存而已,所以a所指向的那塊地方?jīng)]有任何的變化,只不過(guò)在函數(shù)里面發(fā)生了變化,而在函數(shù)外面a的值并未發(fā)生任何變化。
到這里是不是有那么一點(diǎn)略懂了?哈哈哈,來(lái)繼續(xù)深入一點(diǎn)!
二、再來(lái)兩段代碼!
a = [100]def beyond(num):num+=numprint(num)beyond(a)#結(jié)果為:[100, 100] print(a)#結(jié)果為:[100, 100]上述代碼,很明顯,遇到num+=num,其實(shí)說(shuō)白了直接看+=就行,遇到+=先判斷num是否可以修改,很顯然,a指向列表1,存放[100],列表是可變數(shù)據(jù)類(lèi)型,直接再列表1中進(jìn)行了修改,a指向列表1,num指向列表1,而指向+=操作的時(shí)候是直接針對(duì)的列表1操作的,故a和num的最終值都是已經(jīng)改變之后的值,即[100,100]。
a = [100]def beyond(num):num=num+numprint(num)beyond(a)#結(jié)果為:[100, 100] print(a)#結(jié)果為:[100]而這段代碼,a = [100],系統(tǒng)會(huì)為列表100分配內(nèi)存空間,變量a會(huì)指向這個(gè)內(nèi)存空間;接著是是num=num+num,系統(tǒng)會(huì)重新分配一個(gè)新的內(nèi)存空間,存放num+num運(yùn)算結(jié)果,num最終指向這個(gè)新的內(nèi)存空間。a所指向的內(nèi)存空間存放列表[100],而num指向的新的內(nèi)存空間存放的是num+num的結(jié)果即[100,100]。這些輸出結(jié)果就可想而知了吧~
總結(jié):num+=num并不等價(jià)于num=num+num,若是數(shù)字,答案是一樣的,但是真正的原理并不相同。因?yàn)镻ython語(yǔ)言當(dāng)中,并不是值賦值,而是引用。所有的只要牽涉到等號(hào),統(tǒng)統(tǒng)都是引用,
好了,到此結(jié)束,是不是有那么一丟丟感覺(jué)了?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Python中的a+=a和a=a+a的区别(认真看完后,我相信你一定会回来感谢我的)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 颐和园老人需要预约吗
- 下一篇: 第十五章 Python和Web