python對象池

python對象池

python中,一切皆爲對象

id方法的返回值就是對象的內存地址。

is運算符,如果引用的是同一個對象則返回true,x is y類似 id(x) == id(y) 

小整數對象池

[-5, 256] 這些小整數被定義在了一個整數對象池裏,當引用小整數時會自動引用整數對象池裏的對象,所以這些小整數不會重複創建,當多個變量指向同一個小整數時,實質上它們指向的是同一個對象。

字符串

字符串對象是不可變對象,python有個intern機制,簡單說就是維護一個字典,這個字典維護已經創建字符串(key)和它的字符串對象的地址(value),每次創建字符串對象都會和這個字典比較,沒有就創建,重複了就用指針進行引用就可以了。intern機制處理字符串長度小於等於20且僅由數字字母下劃線構成的,只創建一次。

浮點型

float類型可以認爲每個賦值都是創建一個對象,因爲float值很多

元組

tuple它是不可變對象,可能是因爲查找開銷太大,沒有實現intern機制,其實就是一個數組,這個數組和c裏的數組一樣,每次創建都會分配內存空間

常量池

在同一個編譯單元(PyFunctionObject)裏出現的值相同的常量,只會在常量池裏出現一份。常量包括大整數,浮點數,字符串。

 

交互式解釋器測試結果

>>> a = -6
>>> b = -6
>>> a is b
False
>>> a = -5
>>> b = -5
>>> a is b
True
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False

 

執行源碼文件結果

a = -5
b = -5
print(a is b)  # True
a = -6
b = -6
print(a is b)  # False
a = 256
b = 256
print(a is b)  # True
a = 257
b = 257
print(a is b)  # True

 

逐行解釋與整體解釋的差異

爲什麼上述兩段相同的代碼會有不一樣的執行結果,這要考慮到編譯單元的問題。

CPython的代碼的“編譯單元”是函數——每個函數單獨編譯,得到的結果是一個PyFunctionObject對象,其中帶有字節碼、常量池等各種信息。Python的頂層代碼也被看作一個函數。

在CPython的交互式解釋器裏,每輸入一行可以立即執行的代碼,Python就會把它當作一個編譯單元來編譯到字節碼並解釋執行;如果輸入的代碼尚未構成一個完整的單元,例如函數聲明或者類聲明,則等到獲得了完整單元的輸入後再當作一個編譯單元來處理。

處於一個代碼塊的大整數是同一個對象。以下代碼中,a和b處於一個代碼塊,而c和d分別有自己的代碼塊,所以不相等。

a = 1000
b = 1000
print(a is b)  # True
def f1():
    c = 1000
    return c
def f2():
    d = 1000
    return d
print(f1() is f2())  # False

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章