日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python中的a+=a和a=a+a的区别(认真看完后,我相信你一定会回来感谢我的)

發(fā)布時(shí)間:2023/12/1 python 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中的a+=a和a=a+a的区别(认真看完后,我相信你一定会回来感谢我的) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、先來(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í),:

  • 若num+=num #其實(shí)遇到+=是有兩個(gè)過(guò)程要完成
    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的值。
  • 若num=num+num #遇到=直接重新定義一個(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。