python 變數之小整數池跟大整數池

2022-06-12 22:00:12 字數 1779 閱讀 7485

在python中定義變數會有:id,type,value。對於==比較的是value,對於is比較的是id。

因此,對於相同value的變數,它的type相同,但是它的id值可能不一樣。對於相同id的變數,它的type和value值肯定是一樣。

例如:

但是,有的時候對於相同的值,如果建立兩次,會發現它的id值也是一樣的。

例如:

這是因為在互動式模式下

1、python為了優化速度,使用了小整數物件池, 避免為整數頻繁申請和銷毀記憶體空間。python 對小整數的定義是 [-5, 256] 這些整數物件是提前建立好的,不會被垃圾**。在乙個 python 的程式中,無論這個整數處於legb中的哪個位置,所有位於這個範圍內的整數使用的都是同乙個物件。同理,單個字母也是這樣的。

2、intern機制處理空格乙個單詞的復用機會大,所以建立一次,有空格建立多次,但是字串長度大於20,就不是建立一次了。

那麼在pycharm中如何呢?

x = "info walle: 18"*100

y = "info walle: 18"*100

print(x == y) #true

print(x is y) #true

print(id(x), id(y))

我們會發現即使加上空格,x跟y的id還是相同的。

這是因為在pycharm中,

每次執行是所有**都載入都記憶體中,屬於乙個整體,所以這個時候會有乙個大整數物件池,即處於乙個**塊的大整數是同乙個物件。我們只需要記住這是一種優化機制,至於範圍到底多大,無需細究。

因此,對於相同value的變數,它的type相同,但是它的id值可能不一樣。對於相同id的變數,它的type和value值肯定是一樣。

例如:

但是,有的時候對於相同的值,如果建立兩次,會發現它的id值也是一樣的。

例如:

這是因為在互動式模式下

1、python為了優化速度,使用了小整數物件池, 避免為整數頻繁申請和銷毀記憶體空間。python 對小整數的定義是 [-5, 256] 這些整數物件是提前建立好的,不會被垃圾**。在乙個 python 的程式中,無論這個整數處於legb中的哪個位置,所有位於這個範圍內的整數使用的都是同乙個物件。同理,單個字母也是這樣的。

2、intern機制處理空格乙個單詞的復用機會大,所以建立一次,有空格建立多次,但是字串長度大於20,就不是建立一次了。

那麼在pycharm中如何呢?

x = "info walle: 18"*100

y = "info walle: 18"*100

print(x == y) #true

print(x is y) #true

print(id(x), id(y))

我們會發現即使加上空格,x跟y的id還是相同的。

這是因為在pycharm中,

每次執行是所有**都載入都記憶體中,屬於乙個整體,所以這個時候會有乙個大整數物件池,即處於乙個**塊的大整數是同乙個物件。我們只需要記住這是一種優化機制,至於範圍到底多大,無需細究。

Python中小整數物件池和大整數物件池

1.小整數物件池 整數在程式中的使用非常廣泛,python為了優化速度,使用了小整數物件池,避免為整數頻繁申請和銷毀記憶體空間。python 對小整數的定義是 5,256 這些整數物件是提前建立好的,不會被垃圾 在乙個 python 的程式中,無論這個整數處於legb中的哪個位置,所有位於這個範圍內...

小和大整數物件池以及is與 的區別

在實際的程式設計中,數值比較小的整數,比如1 2 29等,可能在程式中會非常頻繁地使用。在python中,所有的物件都是存活在系統堆上。這就是說,如果沒有特殊的機制,對於這些頻繁使用的小整數物件,python將一次又一次地使用malloc在對上申請空間,並且不厭其煩地一次次free。這樣的操作不僅大...

python小整數與str資料池,編碼關係

1 小資料池 數字,字串 數字的範圍 5 256 字串 1,不能有特殊字元 2,s 20 還是乙個位址,s 21以後都是兩個位址 2 編碼關係 ascii a 00000010 8位 乙個位元組 unicode a 00000000 00000001 00000010 00000100 32位 四個...