1. 程式人生 > >代碼塊與小數據池之間的關系

代碼塊與小數據池之間的關系

tps port cmd 交互式 參考 以及 滿足 數字 www

關於python代碼塊以及貯留機制

什麽是代碼塊

python程序是由代碼塊構造的,代碼塊是一個python程序的文本,作為一個單元執行
一個模塊(如time模塊,就是一個.py文件),一個類,一個文件等都是一個代碼塊。
在交互式中輸入的每一行命令都是一個代碼塊(cmd進入python解釋器,每一行就是一個代碼塊)。對於一個文件中的兩個函數,分別是不同的兩個代碼塊。

id,is,==

在python中,id代表內存地址,
例如name = "summer"
id(name) 4324720512

這後面的一串數字,就是"summer"的內存地址,那麽,如果內存地址相同的兩個數,值肯定相同,== 表示的是數值之間的比較,is 是id之間的比較

小數據池

小數據池也稱為小整數緩存機制,或者成為駐留機制

python中小數據池只針對整數、字符串、bool值

優點:提升效率,節省內存

int:在整數中,小數據池的範圍是-5~256,如果多個變量只想範圍內的同一個數字,那麽它們在內存中都是指向同一個內存地址

str:1、字符串的長度為0或者為1,默認采用小數據池 2、當字符串的長度大於1且小於20,並且只含有大小寫字母、數字、下劃線是,默認采用小數據池; 3、指定駐留

from sys import intern
a = intern(‘hello!@‘20)
b = intern(‘hello!@‘
20)
print(a is b)
指定駐留是你可以指定任意的字符串加入到小數據池中,讓其只在內存中創建一個對象,多個變量都是指向這一個字符串。

代碼塊與小數據池之間的關系

同樣一段代碼,為什麽在交互方式中執行,和通過python代碼的文件執行結果不同呢?

# pycharm 通過運行文件的方式執行下列代碼:
i1 = 1000
i2 = 1000
print(i1 is i2) # 結果為True

通過交互方式中執行下面代碼:
>>> i1 = 1000
>>> i2 = 1000
>>> print(i1 is i2)
False


上述結果的不同是因為代碼塊的緩存機制

Python在執行同一個代碼塊的初始化對象的命令時,會檢查是否其值是否已經存在,如果存在,會將其重用。換句話說:執行同一個代碼塊時,遇到初始化對象的命令時,他會將初始化的這個變量與值存儲在一個字典中,在遇到新的變量時,會先在字典中查詢記錄,如果有同樣的記錄那麽它會重復使用這個字典中的之前的這個值。所以在你給出的例子中,文件執行時(同一個代碼塊)會把i1、i2兩個變量指向同一個對象。

如果是不同的代碼塊,他就會看這個兩個變量是否是滿足小數據池的數據,如果是滿足小數據池的數據則會指向同一個地址。所以:i1、i2賦值語句分別被當作兩個代碼塊執行,但是他們不滿足小數據池的數據所以會得到兩個不同的對象,因而is判斷返回False。

對於同一個代碼塊的變量復用的問題,只能針對於數字,字符串,bool值,而對於其他數據類型是不成立的。

本文大量引用和參考鏈接如下:https://www.cnblogs.com/jin-xin/articles/9439483.html

代碼塊與小數據池之間的關系