您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Python中的代碼塊和非代碼塊是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
代碼塊的定義
Python程序是由代碼塊構造的。代碼塊是作為一個單元執行的一段Python程序文本。
也就是說一個類,一個函數,一個腳本文件都是一個代碼塊,此外,當你以交互式的方式輸入的時候,一行就是一個代碼塊。
這是在ipython解釋下以交互式方式輸入,那么這個時候每一行就是一個代碼塊。
如果是在類似pycharm環境運行,那么整個腳本文件都是一個代碼塊。前提是沒有函數或者類。
代碼塊的緩存機制
如果在同一個代碼塊內,會存在有一個緩存機制。
同一個代碼塊內,對對象進行初始化的時候,python解釋器會在內存中尋找這個初始化的值是不是已經存在,如果存在則會引用自同一個內存空間。也就是說我們用is進行判斷,應該返回的是True。也就是python解釋器從上到下進行解釋,遇到一個初始化的對象,就把這個對象,以一個類似字典的形式存在一個內存空間中。如果再遇到初始化語句,解釋器就在這個內存空間尋找是否有同值的對象,如果有,則引用,如果沒有,則重新開辟一個內存空間存放這個初始化的值。
這個機制適用的對象有:int,float,complex ,boolean,str,其中字符串要符合一定規則的,否則不會存在這個緩存機制。
下面來進行一些驗證:
a = 100000000000000000000532758932759.419375091750151513515 b = 100000000000000000000532758932759.419375091750151513515 print(a is b) # True
c = '1478174%^%&$^&$&sfhoaihfoiaf' d = '1478174%^%&$^&$&sfhoaihfoiaf' print(c is d) # True
其實不管你整數或者小數有多長,都符合這個緩存機制,都是指向同一個內存地址。但是字符串就不一樣了。
其實也算不上什么限制,看一下驗證:
s_1 = '#'*4000 s_2 = '#'*4000 print(len(s_1)) print(s_1 is s_2) # True a_1 = '#'*4097 b_1 = '#'*4097 print(len(a_1)) print(a_1 is b_1) # False
在pycharm中測試大概字符串做乘法后長度不超過大約4097長度,那么還是符合這個機制的。
即便是中文也是符合這個的。
不管你是中文加符號加空格加數字加字母,只要長度不超過大約4097那么應該是符合這個機制的。都指向的是同一內存地址。
這樣做的優點就是簡化了內存空間,提升效率,避免重復的去開辟相同的值的內存空間
非同一代碼塊的緩存機制
非同一代碼塊的緩存機制其實和代碼塊的緩存機制很像,只不過對緩存的數據做了一些限制,將符合規定的數據存到了一個數據池當中,也就是一塊內存空間中。
如果你初始化對象值在這個數據池中,那么直接引用就可以,不用再重新開辟一個內存空間存放這個值。這個數據池分為數字數據池和字符串數據池,數字數據池是事先已經創建好了的。
對于非同一代碼塊,符合機制的數據類型有 int,boolean,str
其中,整數只有(-5~256)
對于字符串,我看很多博客只寫了只有全是數字,字母,下劃線組成的字符串才符合這個機制,其實長度為1的字符串或者空字符串也是符合這個機制的。但是不能是中文。
下面進行一些驗證,這里用的是jupyter,是ipython解釋器的交互式命令工具,也就是說每一行就是一個代碼塊。
下面是字符串的驗證:
當字符串做乘法的時候,和同一代碼塊的機制很像,但是只能是只有數字下劃線和字母的字符串做乘法之后長度小于大約4097的長度才會駐留。
上面均采用jupyter為測試環境,每一行都是一個代碼塊。
如果是函數或者類和函數或類外部的非同一代碼塊。因為函數和類本身就是一個代碼塊。
強制駐留
也叫指定駐留,意思就是你可以制定一個字符串加入到字符串數據池中,后面的如果有對象初始化是這個值,則可以直接引用。
import sysa =sys.intern('&&^*^&*123') b = sys.intern('&&^*^&*123') print(a is b) # True
非同一個代碼塊,’&&*&*123’不符合字符串數據池的緩存機制,但是可以用sys模塊的intern方法,強制駐留,強行加入到字符串數據池中。
看完上述內容,你們對Python中的代碼塊和非代碼塊有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。