溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-06-26 13:53:30 來源:億速云 閱讀:895 作者:Leah 欄目:編程語言

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

代碼塊的定義

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

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

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

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

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

代碼塊的緩存機(jī)制

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

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

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

下面來進(jìn)行一些驗(yàn)證:

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ù)或者小數(shù)有多長(zhǎng),都符合這個(gè)緩存機(jī)制,都是指向同一個(gè)內(nèi)存地址。但是字符串就不一樣了。

其實(shí)也算不上什么限制,看一下驗(yàn)證:

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中測(cè)試大概字符串做乘法后長(zhǎng)度不超過大約4097長(zhǎng)度,那么還是符合這個(gè)機(jī)制的。

即便是中文也是符合這個(gè)的。

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

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

非同一代碼塊的緩存機(jī)制

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

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

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

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

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

下面進(jìn)行一些驗(yàn)證,這里用的是jupyter,是ipython解釋器的交互式命令工具,也就是說每一行就是一個(gè)代碼塊。

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

下面是字符串的驗(yàn)證:

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

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

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

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

如果是函數(shù)或者類和函數(shù)或類外部的非同一代碼塊。因?yàn)楹瘮?shù)和類本身就是一個(gè)代碼塊。

強(qiáng)制駐留

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

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

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

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

看完上述內(nèi)容,你們對(duì)Python中的代碼塊和非代碼塊有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI