Python細節面試題--小整數物件池和大整數物件池
阿新 • • 發佈:2021-02-02
在瞭解Python中的小整數物件池和大整數物件池之前,這裡涉及到身份運算子is的使用,is是通過物件的比較,記憶體地址的比較來返回True或者False。我們先來看一個問題:
1.首先,在PyCharm的原始檔中執行一下程式碼:
a = 256
b = 256
print(a is b)
會發現執行結果是True;
然後我們在互動式環境下執行:
我們發現a和b的記憶體地址是一樣的,切執行結果依然是True;
2.然後,我們做一下修改,將a和b的值改為257試一試:
a = 257
b = 257
print(a is b)
我們會發現,在PyCharm的原始檔中執行,結果仍然是True
但是我們在互動式環境下執行一下試試:
我們會發現,這裡a和b的值雖然是一樣的,但是記憶體地址卻是不同的,執行的結果是False,這是為什麼呢?
說明:這是因為在PyCharm中,原始檔對程式碼是批量進行處理的,將程式程式碼整體交給Python直譯器,在程式執行中開闢的所有記憶體都是屬於該次程式執行過程,這裡a和b的值相同,地址相同實現複用。在互動式環境下,所見即所得,在[-5,256]的範圍內的小整數也可實現複用,但是大整數沒有專門的物件池儲存,定義一個大整數,就會開闢一個空間,再次定義一個大整數的話,就會再次開闢一個空間儲存。這裡就要引入兩個概念:小整數物件池和大整數物件池。
1.小整數物件池
Python 對小整數的定義是 [-5, 256] 這些整數物件是提前建立好的,不會被垃圾回收,使用小整數物件池可以優化程式執行速度,避免了頻繁為整數申請和回收記憶體空間,在一個 Python 的程式中,無論這個整數處於LEGB中的哪個位置,所有位於這個範圍內的整數使用的都是同一個物件。
2.大整數物件池
終端每次執行一次,大整數的記憶體空間都重新申請,而在PyCharm中,每次執行是所有程式碼都載入都記憶體中,屬於一個整體,所以這個時候會有一個大整數物件池,即處於一個程式碼塊的大整數是同一個物件。