今天就跟大家聊聊有關Python中的代碼塊和非代碼塊是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、網(wǎng)站建設與策劃設計,突泉網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設十多年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:突泉等地區(qū)。突泉做網(wǎng)站價格咨詢:18982081108
代碼塊的定義
Python程序是由代碼塊構造的。代碼塊是作為一個單元執(zhí)行的一段Python程序文本。
也就是說一個類,一個函數(shù),一個腳本文件都是一個代碼塊,此外,當你以交互式的方式輸入的時候,一行就是一個代碼塊。
這是在ipython解釋下以交互式方式輸入,那么這個時候每一行就是一個代碼塊。
如果是在類似pycharm環(huán)境運行,那么整個腳本文件都是一個代碼塊。前提是沒有函數(shù)或者類。
代碼塊的緩存機制
如果在同一個代碼塊內,會存在有一個緩存機制。
同一個代碼塊內,對對象進行初始化的時候,python解釋器會在內存中尋找這個初始化的值是不是已經存在,如果存在則會引用自同一個內存空間。也就是說我們用is進行判斷,應該返回的是True。也就是python解釋器從上到下進行解釋,遇到一個初始化的對象,就把這個對象,以一個類似字典的形式存在一個內存空間中。如果再遇到初始化語句,解釋器就在這個內存空間尋找是否有同值的對象,如果有,則引用,如果沒有,則重新開辟一個內存空間存放這個初始化的值。
這個機制適用的對象有:int,float,complex ,boolean,str,其中字符串要符合一定規(guī)則的,否則不會存在這個緩存機制。
下面來進行一些驗證:
a = 100000000000000000000532758932759.419375091750151513515 b = 100000000000000000000532758932759.419375091750151513515 print(a is b) # True
c = '1478174%^%&$^&$&sfhoaihfoiaf' d = '1478174%^%&$^&$&sfhoaihfoiaf' print(c is d) # True
其實不管你整數(shù)或者小數(shù)有多長,都符合這個緩存機制,都是指向同一個內存地址。但是字符串就不一樣了。
其實也算不上什么限制,看一下驗證:
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長度,那么還是符合這個機制的。
即便是中文也是符合這個的。
不管你是中文加符號加空格加數(shù)字加字母,只要長度不超過大約4097那么應該是符合這個機制的。都指向的是同一內存地址。
這樣做的優(yōu)點就是簡化了內存空間,提升效率,避免重復的去開辟相同的值的內存空間
非同一代碼塊的緩存機制
非同一代碼塊的緩存機制其實和代碼塊的緩存機制很像,只不過對緩存的數(shù)據(jù)做了一些限制,將符合規(guī)定的數(shù)據(jù)存到了一個數(shù)據(jù)池當中,也就是一塊內存空間中。
如果你初始化對象值在這個數(shù)據(jù)池中,那么直接引用就可以,不用再重新開辟一個內存空間存放這個值。這個數(shù)據(jù)池分為數(shù)字數(shù)據(jù)池和字符串數(shù)據(jù)池,數(shù)字數(shù)據(jù)池是事先已經創(chuàng)建好了的。
對于非同一代碼塊,符合機制的數(shù)據(jù)類型有 int,boolean,str
其中,整數(shù)只有(-5~256)
對于字符串,我看很多博客只寫了只有全是數(shù)字,字母,下劃線組成的字符串才符合這個機制,其實長度為1的字符串或者空字符串也是符合這個機制的。但是不能是中文。
下面進行一些驗證,這里用的是jupyter,是ipython解釋器的交互式命令工具,也就是說每一行就是一個代碼塊。
下面是字符串的驗證:
當字符串做乘法的時候,和同一代碼塊的機制很像,但是只能是只有數(shù)字下劃線和字母的字符串做乘法之后長度小于大約4097的長度才會駐留。
上面均采用jupyter為測試環(huán)境,每一行都是一個代碼塊。
如果是函數(shù)或者類和函數(shù)或類外部的非同一代碼塊。因為函數(shù)和類本身就是一個代碼塊。
強制駐留
也叫指定駐留,意思就是你可以制定一個字符串加入到字符串數(shù)據(jù)池中,后面的如果有對象初始化是這個值,則可以直接引用。
import sysa =sys.intern('&&^*^&*123') b = sys.intern('&&^*^&*123') print(a is b) # True
非同一個代碼塊,’&&*&*123’不符合字符串數(shù)據(jù)池的緩存機制,但是可以用sys模塊的intern方法,強制駐留,強行加入到字符串數(shù)據(jù)池中。
看完上述內容,你們對Python中的代碼塊和非代碼塊有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
網(wǎng)站題目:Python中的代碼塊和非代碼塊是什么
文章源于:http://aaarwkj.com/article0/gjgjoo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設、微信公眾號、網(wǎng)站策劃、域名注冊、App開發(fā)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)