變數快取/記憶體駐留機制
阿新 • • 發佈:2022-03-17
一. 定義
a=10 b=10 print(id(a)) #4401347152 print(id(b)) #4401347152
總結:
# 數值型別(int, float, bool)
1.對於整型而言,-5~正無窮範圍內的相同值 id一致
2.對於浮點數而言,正數範圍內的相同值 id一致
3.布林值而言,值相同情況下,id一致
4.字串值相同,id一致
# 容器/複合資料型別(list, set, dict, tuple)
5.空元組 相同的情況下,地址相同
6.列表,元組,字典,集合無論什麼情況 id標識都不同
特別說明:
簡單元組,超出範圍的整型,浮點型,在pycharm中因為是基於文字模式,所以會被當成一個整體在python直譯器中被快取,但是在黑視窗下因為是基於互動模式,因此一行程式碼就是一個整體,因此不會被快取。
二. is運算子
# 在python中如果要比較兩個變數是否同一個值,一般是使用 == 判斷。 # 但是,如果在判斷的基礎上,還要判斷兩個變數的記憶體地址是否一樣的話,則需要使用is來判斷 # 在python單純依靠 == 判斷兩個資料,只能判斷值是否一致 # 如果要判斷資料是否是同一個,那麼還要判斷記憶體地址是否一樣 a = -10 b = -10 print( id(a) == id(b)) #文字模式下True,互動模式下False # 除了上面直接使用id函式提取記憶體地址判斷以外,可以使用is運算子來判斷值是否一樣,記憶體地址是否一樣。 a = -10 b = -10 print( a is b) # True a = [1,2] b = [1,2] print(a is b) # False
說明:
1. 基於is可以直接判斷兩個資料的值是否一樣,記憶體地址同一個
2. 基於== 只能判斷兩個資料的值是否一樣
三. 小資料池
不同的python檔案(模組)中的程式碼裡面的相同資料的本應該是不在同一個記憶體地址當中的, 而是應該全新的開闢一個新空間,但是這樣也會佔用了更多的記憶體,所以python定義了小資料池的概念,預設允許小部分資料即使在不同的檔案當中,只要資料相同就可以使用同一個記憶體空間 ,以達到節省記憶體的目的。
小資料池只針對:int、bool、None關鍵字 ,這些資料型別有效。(int有爭議,在部分系統下沒有被快取到小資料池中)
# 在其他語言中,如果不同檔案/不同視窗下,建立的變數的資料即便一樣,也是儲存不同的記憶體空間中的。 # 但是,python為了達到優化的目的,會把簡單的小資料(整型,浮點型,None, bool)固話在一個相同記憶體中,所以python不同檔案的小資料,記憶體地址是一樣的。
以下為兩個py檔案下執行內容,得到的id值相同
a = 5 print(a, id(a))