日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python字符串常量有什么区别_Python经典面试题:is与==的区别

發(fā)布時(shí)間:2025/3/11 python 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python字符串常量有什么区别_Python经典面试题:is与==的区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

is用于判斷兩個(gè)對(duì)象是否為同一個(gè)對(duì)象,具體來(lái)說(shuō)是兩個(gè)對(duì)象在內(nèi)存中的位置是否相同。

python為了提高效率,節(jié)省內(nèi)存,在實(shí)現(xiàn)上大量使用了緩沖池技術(shù)和字符串intern技術(shù)。

整數(shù)和字符串是不可變對(duì)象,也就意味著可以用來(lái)共享,如100個(gè)“python”字串變量可以共享一個(gè)“python”字符串對(duì)象,而不是創(chuàng)建100個(gè)“python”字符串。

一、小整數(shù)對(duì)象池

為了應(yīng)對(duì)小整數(shù)的頻繁使用,python使用對(duì)小整數(shù)進(jìn)行了緩存,默認(rèn)范圍為[-5,256],在這個(gè)范圍內(nèi)的所有整數(shù)被python完全地緩存,當(dāng)有變量使用這些小整數(shù)時(shí),增加對(duì)應(yīng)小整數(shù)對(duì)象的引用即可。

由上面的實(shí)例可以看到,當(dāng)變量在[-5,256]之間時(shí),兩個(gè)值相同的變量事實(shí)上會(huì)引用到同一個(gè)小整數(shù)對(duì)象上,也就是小整數(shù)對(duì)象池中的對(duì)象,而不會(huì)去創(chuàng)建兩個(gè)對(duì)象。而當(dāng)變量超出了這個(gè)范圍,兩個(gè)值相同的變量也會(huì)各自創(chuàng)建整數(shù)對(duì)象,所以兩者對(duì)應(yīng)的對(duì)象不同。

二、字符串intern

如果當(dāng)前變量引用的字符串對(duì)象已經(jīng)存在的話,直接增加對(duì)應(yīng)字符串對(duì)象的引用,而不去創(chuàng)建新的字符串對(duì)象,這就是字符串intern機(jī)制。

說(shuō)白了,intern機(jī)制就是每創(chuàng)建一個(gè)比較短的字符串對(duì)象,就在一個(gè)叫interned的字典里面查看是否存在字符串相同的字符串對(duì)象,如果存在的話,就把字典存放的對(duì)象的ob_refcnt加1,然后銷毀新創(chuàng)建的對(duì)象,所以才會(huì)出現(xiàn)下面的情景?a is b的結(jié)果為True:

1. 奇怪的現(xiàn)象

在詳細(xì)探討字符串intern機(jī)制之前,先看一個(gè)奇怪的問(wèn)題:

直接在交互式IPython中運(yùn)行:

i is j的結(jié)果是False。

定義一個(gè)函數(shù)并運(yùn)行:

輸出結(jié)果:

True

上述代碼分開運(yùn)行,結(jié)果為False,但是合在一起結(jié)果卻為True。也就是說(shuō)分開運(yùn)行的時(shí)候,i和j指向不同對(duì)象,而合在一起的時(shí)候i,j卻指向了相同對(duì)象。為了明白其中的緣由,需要簡(jiǎn)單理解python的編譯機(jī)制。

三、編譯機(jī)制

在python中,萬(wàn)物皆對(duì)象,包括代碼本身也是一種對(duì)象。python用code對(duì)象表示代碼,代碼編譯后產(chǎn)生code對(duì)象。通常一個(gè)作用域?qū)?yīng)一個(gè)code對(duì)象。

1. 編譯結(jié)果

上述代碼中編譯生成了兩個(gè)code對(duì)象,一個(gè)代表全局作用域,另一個(gè)代表函數(shù)f。

code對(duì)象保存了變量,常量(常量字面量)以及編譯結(jié)果。code對(duì)象用常量表來(lái)保存常量,考慮到一個(gè)常量可能出現(xiàn)多次,在一張表上保存一個(gè)常量多次太過(guò)于奢侈。所以code對(duì)象對(duì)每個(gè)常量只保存一次,在需要引用它的地方使用它在常量表的位置作為常量的表示。在上述編譯結(jié)果中可以看到,"1 2"這個(gè)字符串常量使用了兩次,編譯的代碼為"LOAD_CONST 0",這里的0就是"1 2"在常量表當(dāng)中的位置。

由于編譯的這個(gè)特性,在同一個(gè)code對(duì)象 中的變量,如果它們引用了同一個(gè)常量,那么無(wú)論這個(gè)常量有沒(méi)有緩沖機(jī)制,它們引用的都是同一個(gè)對(duì)象。

2. 案例理解

輸出結(jié)果:

True True True True

字符串對(duì)象除了intern機(jī)制以外,還有類似于小整數(shù)對(duì)象的字符緩沖池,其實(shí)就是用一個(gè)類似于數(shù)組的東西(characters array)指向這個(gè)對(duì)象,對(duì)只有一個(gè)字符的字符串,第一次創(chuàng)建時(shí)候會(huì)進(jìn)行如下操作:

1.創(chuàng)建對(duì)象

2.對(duì)其進(jìn)行intern操作

3.將對(duì)象放進(jìn)字符緩沖池

那么下次再創(chuàng)建這個(gè)字符對(duì)象時(shí)候,會(huì)首先查看字符緩沖池中是否存在這個(gè)對(duì)象,如果存在的話,返回這個(gè)緩沖對(duì)象。區(qū)別于小整數(shù)對(duì)象的是,小整數(shù)對(duì)象在python解釋器初始化之初就創(chuàng)建了,而字符串緩沖池指向的對(duì)象直到用到的時(shí)候才會(huì)創(chuàng)建。

四、編譯機(jī)制與小整數(shù)對(duì)象池對(duì)比

i和j引用同一個(gè)常量,這是編譯機(jī)制,所以i與j指向同一個(gè)整數(shù)對(duì)象,后面a和b雖然相等,但不引用常量,此時(shí)啟用小整數(shù)對(duì)象池,a和b都等于256,在對(duì)象池中,所以a,b引用同一個(gè)對(duì)象,后面c和d不在對(duì)象池中,所以兩者對(duì)象不同。

這里有一點(diǎn)需要注意,沒(méi)有變量參與的運(yùn)算會(huì)被編譯器直接優(yōu)化成對(duì)應(yīng)的常量,進(jìn)而保存進(jìn)常量表中。

五、字符串intern機(jī)制與字符緩沖池

在編譯過(guò)程中,字符串intern機(jī)制將所有的變量名進(jìn)行intern,但對(duì)常量進(jìn)行的intern有一點(diǎn)特殊的限制。能夠intern的常量必須只包含[a-zA-Z0-9_],即字母數(shù)字加下劃線,如果含有其他字符,就不會(huì)intern。在運(yùn)行過(guò)程中,通過(guò)計(jì)算得到的字符串不會(huì)intern。

字符串有一個(gè)和小整數(shù)對(duì)象池相似的字符緩沖池,用于在運(yùn)行過(guò)程中緩存單個(gè)字符,所以計(jì)算得到的字符串雖然不會(huì)intern,但如果是單個(gè)字符,就會(huì)使用到字符緩沖池。

可以看到,a和b確實(shí)指向同一個(gè)對(duì)象,而c和d指向不同對(duì)象,這就是字符緩沖池。

六、編譯機(jī)制與字符串intern對(duì)比

i包含空格,包含空格的常量不會(huì)被intern,而其他兩個(gè)常量不包含其他字符,所以會(huì)被intern。

七、總結(jié)python代碼被編譯成code對(duì)象,通常一個(gè)code對(duì)象對(duì)應(yīng)于一個(gè)作用域,作用域中重復(fù)出現(xiàn)的變量名以及常量在code中只保存一次。

字符串intern機(jī)制主要作用于編譯過(guò)程,在編譯收集完變量和常量時(shí),對(duì)變量和常量進(jìn)行intern,而后構(gòu)建一個(gè)code對(duì)象。

字符串intern對(duì)常量的intern有限制,能夠intern的常量必須只包含[a-zA-Z0-9_],即字母數(shù)字加下劃線,如果含有其他字符,就不會(huì)intern。

小整數(shù)對(duì)象池和字符緩沖池都是作用于運(yùn)行過(guò)程中,python緩存小的整數(shù)和字符,當(dāng)有變量使用這些對(duì)象時(shí),不用額外創(chuàng)建對(duì)象。

總結(jié)

以上是生活随笔為你收集整理的python字符串常量有什么区别_Python经典面试题:is与==的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。