前面我們說了,只要是賦值操作,產(chǎn)生新的值的時(shí)候,都會(huì)申請(qǐng)一塊內(nèi)存空間。只要申請(qǐng)了新的內(nèi)存空間,他的內(nèi)存地址就會(huì)不一樣,id也會(huì)不一樣。
現(xiàn)在我定義a=10,b=10,按照我們前面分析的,這兩串代碼一運(yùn)行,肯定申請(qǐng)兩塊內(nèi)存空間把值丟進(jìn)去然后分別綁定給這兩個(gè)變量a和b。所以它們的id肯定不一樣。
我們先來看a的id號(hào),注意在Python的交互式環(huán)境里,敲回車之后,代碼會(huì)立即執(zhí)行,并且會(huì)直接把結(jié)果展示出來。所以這里不用print也能看到結(jié)果。
再來看b的id號(hào)。
這又是什么情況,為什么兩個(gè)id號(hào)又變成一模一樣的了?是不是這個(gè)傻逼老師在騙我?
再用is看一下,是不是True?居然還是True!按照我們前面分析的這兩個(gè)id號(hào)不可能一樣??!
現(xiàn)在我們分析一下,申請(qǐng)內(nèi)存空間,把值存進(jìn)去,這就是一種寫操作,就是前面講引薦基礎(chǔ)的時(shí)候我們說的io操作,不管是往硬盤里面讀數(shù)據(jù)還是往內(nèi)存里寫數(shù)據(jù)這都叫io操作。
前面我們也說了,cpu的運(yùn)算速度是相當(dāng)快的,比內(nèi)存的讀寫速度快,比硬盤的讀寫速度更快,所以一旦你的程序里有了io操作,就會(huì)拖慢了你的cpu的速度。所以python就幫我們做了一步優(yōu)化叫小整數(shù)池。
為了避免因創(chuàng)建相同的值,而重復(fù)申請(qǐng)內(nèi)存空間所帶來的效率,Python解釋器會(huì)在啟動(dòng)那一刻開始創(chuàng)建小整數(shù)池。范圍是-5到256。就是只要Python解釋器一啟動(dòng),就立馬申請(qǐng)一堆內(nèi)存空間,把這些值放進(jìn)去。
這些整數(shù)在我們寫程序的過程中太常見了所以Python給我們做了優(yōu)化,這個(gè)范圍內(nèi)的小整數(shù)被重復(fù)使用時(shí),就不會(huì)再申請(qǐng)新的內(nèi)存空間。而這些小整數(shù)永遠(yuǎn)不會(huì)被垃圾回收機(jī)制回收。
我們?cè)賮砜?,c=5+5,這樣c=10了,然后再打印id(c),結(jié)果c的id號(hào)就和a和b的id號(hào)一樣。所以說只要你程序運(yùn)行過程中產(chǎn)生了10這個(gè)值。它就不會(huì)再去給你申請(qǐng)新的內(nèi)存空間造一個(gè)新的值出來了,它會(huì)直接使用現(xiàn)成的。這樣對(duì)你程序運(yùn)行的效率就是一種提升。
剛剛說了小整數(shù)池的范圍-5到256,留個(gè)課后作業(yè),現(xiàn)在定一兩個(gè)變量a=257,b=257。看看他們的兩個(gè)id號(hào)是不是一樣的!
未經(jīng)允許不得轉(zhuǎn)載:445IT之家 » Python小整數(shù)池的概念