Python中的代碼塊和非代碼塊是什么

今天就跟大家聊聊有關(guān)Python中的代碼塊和非代碼塊是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、網(wǎng)站建設(shè)與策劃設(shè)計,突泉網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:突泉等地區(qū)。突泉做網(wǎng)站價格咨詢:18982081108

代碼塊的定義

Python程序是由代碼塊構(gòu)造的。代碼塊是作為一個單元執(zhí)行的一段Python程序文本。

也就是說一個類,一個函數(shù),一個腳本文件都是一個代碼塊,此外,當你以交互式的方式輸入的時候,一行就是一個代碼塊。

Python中的代碼塊和非代碼塊是什么

這是在ipython解釋下以交互式方式輸入,那么這個時候每一行就是一個代碼塊。

如果是在類似pycharm環(huán)境運行,那么整個腳本文件都是一個代碼塊。前提是沒有函數(shù)或者類。

代碼塊的緩存機制

如果在同一個代碼塊內(nèi),會存在有一個緩存機制。

同一個代碼塊內(nèi),對對象進行初始化的時候,python解釋器會在內(nèi)存中尋找這個初始化的值是不是已經(jīng)存在,如果存在則會引用自同一個內(nèi)存空間。也就是說我們用is進行判斷,應(yīng)該返回的是True。也就是python解釋器從上到下進行解釋,遇到一個初始化的對象,就把這個對象,以一個類似字典的形式存在一個內(nèi)存空間中。如果再遇到初始化語句,解釋器就在這個內(nèi)存空間尋找是否有同值的對象,如果有,則引用,如果沒有,則重新開辟一個內(nèi)存空間存放這個初始化的值。

這個機制適用的對象有:int,float,complex ,boolean,str,其中字符串要符合一定規(guī)則的,否則不會存在這個緩存機制。

下面來進行一些驗證:

a = 100000000000000000000532758932759.419375091750151513515
b = 100000000000000000000532758932759.419375091750151513515
print(a is b)  # True

Python中的代碼塊和非代碼塊是什么

c = '1478174%^%&$^&$&sfhoaihfoiaf'
d = '1478174%^%&$^&$&sfhoaihfoiaf'
print(c is d)  # True

Python中的代碼塊和非代碼塊是什么

其實不管你整數(shù)或者小數(shù)有多長,都符合這個緩存機制,都是指向同一個內(nèi)存地址。但是字符串就不一樣了。

其實也算不上什么限制,看一下驗證:

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

Python中的代碼塊和非代碼塊是什么

在pycharm中測試大概字符串做乘法后長度不超過大約4097長度,那么還是符合這個機制的。

即便是中文也是符合這個的。

不管你是中文加符號加空格加數(shù)字加字母,只要長度不超過大約4097那么應(yīng)該是符合這個機制的。都指向的是同一內(nèi)存地址。

這樣做的優(yōu)點就是簡化了內(nèi)存空間,提升效率,避免重復(fù)的去開辟相同的值的內(nèi)存空間

非同一代碼塊的緩存機制

非同一代碼塊的緩存機制其實和代碼塊的緩存機制很像,只不過對緩存的數(shù)據(jù)做了一些限制,將符合規(guī)定的數(shù)據(jù)存到了一個數(shù)據(jù)池當中,也就是一塊內(nèi)存空間中。

如果你初始化對象值在這個數(shù)據(jù)池中,那么直接引用就可以,不用再重新開辟一個內(nèi)存空間存放這個值。這個數(shù)據(jù)池分為數(shù)字數(shù)據(jù)池和字符串數(shù)據(jù)池,數(shù)字數(shù)據(jù)池是事先已經(jīng)創(chuàng)建好了的。

對于非同一代碼塊,符合機制的數(shù)據(jù)類型有 int,boolean,str

其中,整數(shù)只有(-5~256)

對于字符串,我看很多博客只寫了只有全是數(shù)字,字母,下劃線組成的字符串才符合這個機制,其實長度為1的字符串或者空字符串也是符合這個機制的。但是不能是中文。

下面進行一些驗證,這里用的是jupyter,是ipython解釋器的交互式命令工具,也就是說每一行就是一個代碼塊。

Python中的代碼塊和非代碼塊是什么

下面是字符串的驗證:

Python中的代碼塊和非代碼塊是什么

當字符串做乘法的時候,和同一代碼塊的機制很像,但是只能是只有數(shù)字下劃線和字母的字符串做乘法之后長度小于大約4097的長度才會駐留。

Python中的代碼塊和非代碼塊是什么

上面均采用jupyter為測試環(huán)境,每一行都是一個代碼塊。

如果是函數(shù)或者類和函數(shù)或類外部的非同一代碼塊。因為函數(shù)和類本身就是一個代碼塊。

強制駐留

也叫指定駐留,意思就是你可以制定一個字符串加入到字符串數(shù)據(jù)池中,后面的如果有對象初始化是這個值,則可以直接引用。

Python中的代碼塊和非代碼塊是什么

import sysa =sys.intern('&&^*^&*123')
b = sys.intern('&&^*^&*123')
print(a is b)  # True

非同一個代碼塊,’&&*&*123’不符合字符串數(shù)據(jù)池的緩存機制,但是可以用sys模塊的intern方法,強制駐留,強行加入到字符串數(shù)據(jù)池中。

看完上述內(nèi)容,你們對Python中的代碼塊和非代碼塊有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

網(wǎng)站題目:Python中的代碼塊和非代碼塊是什么
文章源于:http://www.muchs.cn/article0/gjgjoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設(shè)、微信公眾號、網(wǎng)站策劃域名注冊、App開發(fā)、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營