python類載入機制 python的變數快取機制

2021-10-19 03:30:02 字數 4602 閱讀 8698

變數的快取機制

變數的快取機制(以下內容僅對python3.6.x版本負責)

機制只要有兩個值相同,就只開闢乙個空間

為什麼要有這樣的機制

在計算機的硬體當中,記憶體是最重要的配置之一,直接關係到程式的執行速度和流暢度。在過去計算機記憶體資源昂貴而小的年代中,程式的記憶體管理成為程式設計中的重要技術之一。python沒有c/c++中的指標那樣的定義可以程式設計者自主的控制記憶體的分配,而是有一套自動的記憶體位址分配和快取機制。在這個機制當中,可以把一些相同值的變數在記憶體中指向同一塊區域,而不再重新開闢乙個空間,這樣就達到了節省記憶體的目的。

在這裡插入描述

在這裡插入描述

python中使用id()函式檢視資料的記憶體位址

number部分

整型對於整型而言,-5~~正無窮的範圍內的相同值的id位址一致

# 在後續的版本中所有的數的id位址都一致

# 相同

print(id(9999999), id(9999999))

print(id(100), id(100))

print(id(-5), id(-5))

# 不同

print(id(-6), id(-6))

浮點型對於浮點型而言,非負數範圍內的相同值id一致

# 相同

print(id(9999999.0), id(9999999.0))

print(id(100.0), id(100.0))

# 不同

print(id(-5.0), id(-5.0))

print(id(-6.0), id(-6.0))

布林值對於布林值而言,值相同測情況下,id一致

# 相同

print(id(true), id(true))

print(id(false), id(false))

複數複數在(實數+虛數)這樣的結構當中永不相同,只有單個虛數相同才會一致

# 相同

print(id(1j), id(1j))

print(id(0j), id(0j))

# 不同

print(id(1234j), id(3456j))

print(id(1+1j), id(1+1j))

print(id(2+0j), id(2+0j))

容器部分

字串字串在相同的情況下,位址相同

# 相同

print(id('hello '), id("hello "))

# 不同

print(id('msr'), id('wxd'))

字串配合使*號使用有特殊的情況:

# 等於1,和正常的情況下是一樣的,只要值相同位址就是一樣的

a = 'hello ' * 1

b = 'hello ' * 1

print(a is b)

a = '祖國' * 1

b = '祖國' * 1

print(a is b)

# 純數字字母下劃線,且長度不大於20

a = '_70th' * 3

b = '_70th' * 3

c = '_70th_70th_70th'

print(a, id(a), len(a))

print(b, id(b), len(b))

print(c, id(c), len(c))

print(a is b is c)

結果:_70th_70th_70th 1734096389168 15

_70th_70th_70th 1734096389168 15

_70th_70th_70th 1734096389168 15

true

# 純數字字母下劃線,長度大於20

a = 'motherland_70th' * 3

b = 'motherland_70th' * 3

c = 'motherland_70thmotherland_70thmotherland_70th'

print(a, id(a), len(a))

print(b, id(b), len(b))

print(c, id(c), len(c))

print(a is b is c)

結果:motherland_70thmotherland_70thmotherland_70th 2281801354864 45

motherland_70thmotherland_70thmotherland_70th 2281801354960 45

motherland_70thmotherland_70thmotherland_70th 2281801354768 45

false

# 有其它字元,且長度不大於20

a = '你好' * 3

b = '你好' * 3

c = '你好你好你好'

print(a, id(a), len(a))

print(b, id(b), len(b))

print(c, id(c), len(c))

print(a is b is c)

結果:你好你好你好 3115902573360 6

你好你好你好 3115902573448 6

你好你好你好 3115900671904 6

false

字串指定駐留

使用sys模組中的intern函式,讓變數指向同乙個位址,只要字串的值是相同的,無論字元的型別、長度、變數的數量,都指向同乙個記憶體位址。

語法:intern(string)

from sys import intern

a = intern('祖國70華誕: my 70th birthday of the motherland' * 1000)

b = intern('祖國70華誕: my 70th birthday of the motherland' * 1000)

c = intern('祖國70華誕: my 70th birthday of the motherland' * 1000)

d = intern('祖國70華誕: my 70th birthday of the motherland' * 1000)

e = intern('祖國70華誕: my 70th birthday of the motherland' * 1000)

print(a is b is c is d is e)

元組元組只有為空的情況下,位址相同

# 相同

print(id(()), id(tuple()))

# 不同

print(id((1, 2)), id((1, 2)))

列表、集合、字典

任何情況下,位址都不會相同

# 列表、非空元組、集合、字典 無論在宣告情況下,id表示都不會相同

# 不同

print(id(), id())

print(id(set()), id(set()))

print(id({}), id({}))

總結# -->number 部分

1.對於整型而言,-5~正無窮範圍內的相同值 id一致

2.對於浮點數而言,非負數範圍內的相同值 id一致

3.布林值而言,值相同情況下,id一致

4.複數在 實數+虛數 這樣的結構中永不相同(只有虛數的情況例外,只有虛數的虛數相同才會id一致)

# -->容器型別部分

5.字串 和 空元組 相同的情況下,位址相同

6.列表,元組,字典,集合無論什麼情況 id標識都不同 [空元組例外]

小資料池

以下內容僅對python3.6.8負責

資料在同乙個檔案(模組)當中,變數儲存的的快取機制就是上述的那樣。

但是如果是在不同檔案(模組)當中的資料,部分資料就會駐留在小資料池當中。

什麼是小資料池

不同的python檔案(模組)中的相同資料的本應該是不在同乙個記憶體位址當中的, 而是應該全新的開闢乙個新空間,但是這樣就造成了記憶體的空間壓力,所以python定義了小資料池的概念,預設允許小部分資料即使在不同的檔案當中,只要資料相同就可以使用同乙個記憶體空間,節省記憶體。

小資料池支援什麼型別

小資料池只針對:int、bool、none關鍵字 ,這些資料型別有效。

int對於int而言,python在記憶體中建立了-5 ~ 256 範圍的整數,提前駐留在了記憶體的一塊區域,如果是不同檔案(模組)的兩個變數,宣告同乙個值,在-5~256這個範圍裡,那麼id一致,兩個變數的值都同時指向乙個值的位址,節省空間。

# 現在我們開啟兩個終端,進入python環境中,然後執行下面的指令,你會發現,只有-5 ~ 256範圍內的整型的id值相同,而不是之前說過的是-5 ~ 正無窮的範圍,這是因為,兩個終端環境就相當於兩個python檔案或者是模組。

print(id(1000))

print(id(500))

print(id(257))

print(id(256))

print(id(-5))

print(id(-6))

在這裡插入描述

其它布林、none這些型別都是有效的

# 開啟兩個終端測試吧

print(id(true))

print(id(false))

print(id(none))

在這裡插入描述

類載入機制

類的生命週期 乙個類從被載入到記憶體中開始,他的生命週期包括以下幾個階段 類載入時機 類是什麼時候開始載入的?虛擬機器並沒有明確規定,可以由虛擬機器自行實現,但是在類初始化前類必須被載入,虛擬機器明確規定了有且只有5種情況必須進行類的初始化,因此我們也可以理解為類載入的5個時機。使用new關鍵字例項...

雙親委託類載入機制 類載入器機制

啟動類載入器和擴充套件類載入器沒有父類載入器,而系統類載入器的父類載入器是擴充套件類載入器,自定義類載入器父類載入器則是擴充套件類載入器 所謂的類載入 就是建立.class檔案對應的class物件,並將class檔案載入到記憶體的過程。1 載入 查詢類的.class檔案,並建立class物件 3 初...

JVM 類載入機制 類載入器

類宣告週期 檔案格式驗證 基於二進位製流,只有這一步是基於二進位製流,後續步驟都是基於方法區資料 1.魔數 cafe babe 開頭 2.主次版本是否在當前jvm支援範圍 3.常量池的常量是否不被支援 4.很多很多規範 元資料驗證 1.類是否有父類,object 2.匪類是否繼承了被final修飾的...