python 常量池 python中的物件池

2021-10-12 11:10:24 字數 1721 閱讀 3531

python中,一切皆為物件

id方法的返回值就是物件的記憶體位址。

is運算子,如果引用的是同乙個物件則返回true,x is y類似 id(x) == id(y)

1.小整數物件池

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

2.字串

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

3.浮點型

float型別可以認為每個賦值都是建立乙個物件,因為float值很多

4.元組

tuple它是不可變物件,可能是因為查詢開銷太大,沒有實現intern機制,其實就是乙個陣列,這個陣列和c裡的陣列一樣,每次建立都會分配記憶體空間

5.常量池

在同乙個編譯單元(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

python語言常量 Python 定義常量

python python開發 python語言 python 定義常量 常量在編寫程式的時候,一旦設定就不能再進行變動,常量一種約定俗成的方式,所有字母大寫並用下劃線分隔單詞的方式 如max value,out time等 但是python沒有提供設定常量用法,需要自己自定義類實現常量功能。自定義...

python合法常量 python內建常量是什麼?

摘要 學習python的過程中,我們會從變數常量開始學習,那麼python內建的常量你知道嗎?乙個新產品,想熟悉它,最好的辦法就是檢視說明書!沒錯,python也給我們準備了這樣的說明書 python官方文件。想知道python內建常量其實很簡單,在官方文件就可找到。這裡我們來依次熟悉一下,看看這些...

python合法常量 Python常量的簡單實現

眾所周知,在python中其實並沒有乙個嚴格定義的常量概念。目前所採用的常用約定俗成的方式是採用命名全為大寫字母的方式來標識別常量。但實際上這種方式並不能起到防止修改的功能,而只是從語義和可讀性上做了區分。那麼,應該怎麼實現乙個簡單的常量呢?這個就需要借助於python裡的物件導向的實現和描述符 值...