亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python中的 is 和 == 以及字符串駐留機(jī)制詳解

系統(tǒng) 1759 0

is 和 ==

先了解下官方文檔中關(guān)于 is 和 == 的概念。is 表示的是對(duì)象標(biāo)示符(object identity),而 == 表示的是相等(equality);is 的作用是用來檢查對(duì)象的標(biāo)示符是否一致,也就是比較兩個(gè)對(duì)象在內(nèi)存中的地址是否一樣(相當(dāng)于檢查 id(a) == id(b)),而 == 是用來檢查兩個(gè)對(duì)象引用的值是否相等(相當(dāng)于檢查 a.eq(b));這點(diǎn)和Java有點(diǎn)類似,只不過Java中是用 == 來比較兩個(gè)對(duì)象在內(nèi)存中的地址,用 equals() 來檢查兩者之間的值是否相等。

is ==
概念 對(duì)象標(biāo)示符 相等
作用 比較對(duì)象在內(nèi)存中的地址 檢查兩個(gè)對(duì)象引用的值
示例 id(a) == id(b) a.eq(b)

字符串駐留機(jī)制

Python中的字符串采用了intern機(jī)制,當(dāng)需要值相同的字符串的時(shí)候(比如標(biāo)識(shí)符),可以直接從字符串池里拿來使用,避免頻繁的創(chuàng)建和銷毀,提升效率和節(jié)約內(nèi)存,因此拼接和修改字符串是會(huì)比較影響性能的。

因?yàn)槭遣豢勺兊模宰址牟僮鞫疾皇莚eplace,而是新建對(duì)象,這也是為什么拼接多字符串的時(shí)候不建議用+而用join(),join()是先計(jì)算出所有字符串的長(zhǎng)度,然后再拷貝,只new一次對(duì)象。

需要注意的是,并不是所有的字符串都會(huì)采用intern機(jī)制,當(dāng)且僅當(dāng)只包含下劃線、數(shù)字、字母的字符串才會(huì)被intern。

相關(guān)示例

示例一

            
a = "hello"
b = "hello"
print(a is b) # 輸出 True 
print(a == b) # 輸出 True
          

值相同的簡(jiǎn)單字符串對(duì)象在字符串池里只會(huì)保存一份,這決定了字符串必須是不可變對(duì)象,所以a和b是同一個(gè)對(duì)象

示例二

            
a = "hello world"
b = "hello world"
print(a is b) # 輸出 False
print(a == b) # 輸出 True 
          

a和b中都有空格,所以不會(huì)被intern(空格不是python標(biāo)識(shí)符),故a和b不是同一個(gè)對(duì)象。注意,這僅僅是在交互式命令行中執(zhí)行,而在PyCharm或者保存為文件執(zhí)行,結(jié)果是不一樣的,主要是因?yàn)榻忉屍髯隽艘徊糠謨?yōu)化

示例三

            
a = 'ab' + 'c' is 'abc'
print(a) # 輸出 True
ab = 'ab'
b = ab + 'c' is 'abc'
print(b) # 輸出 False
          

第一個(gè)'ab'+'c'是在compile-time(編譯期)求值的,被替換成了'abc',所以輸出為True;第二個(gè)示例,ab+'c'是在run-time(運(yùn)行期)拼接的,導(dǎo)致沒有被自動(dòng)intern

示例四

            
a = [1, 2, 3]
b = [1, 2, 3]
print(a is b) # 輸出 False
print(a == b) # 輸出 True 
          

a和b是列表,不是同一個(gè)對(duì)象

示例五

            
a = [1, 2, 3]
b = a
print(a is b) # 輸出 True 
print(a == b) # 輸出 True
          

把a(bǔ)的引用復(fù)制給b(引用賦值),在內(nèi)存中其實(shí)是指向同一個(gè)對(duì)象

示例六

            
a = ["I", "love", "Python"]
b = a[:]
print(a is b) # 輸出 False
print(a == b) # 輸出 True
print(a[0] is b[0]) # 輸出 True
print(a[0] == b[0]) # 輸出 True
          

b通過切片操作重新分配了對(duì)象(切片賦值),但值和a相同。由于切片拷貝是淺拷貝,這說明列表中的元素并未重新創(chuàng)建,因此a[0] is b[0]輸出為True

示例七

            
a = 1
b = 1
print(a is b) # 輸出 True
print(a == b) # 輸出 True
          

Python會(huì)對(duì)比較小的整數(shù)對(duì)象進(jìn)行緩存,下次用的時(shí)候直接從緩存中獲取

示例八

            
a = 320
b = 320
print(a is b) # 輸出 False
print(a == b) # 輸出 True
          

Python僅僅對(duì)比較小的整數(shù)對(duì)象進(jìn)行緩存(范圍為范圍[-5, 256]),而并非是所有整數(shù)對(duì)象。注意,這僅僅是在交互式命令行中執(zhí)行,而在PyCharm或者保存為文件執(zhí)行,結(jié)果是不一樣的,主要是因?yàn)榻忉屍髯隽艘徊糠謨?yōu)化

is 與 == 對(duì)比

is 與 == 相比計(jì)算速度會(huì)更快,因?yàn)樗荒苤剌d,不用進(jìn)行特殊的函數(shù)調(diào)用,通過直接比較兩個(gè)整數(shù) id,減少了函數(shù)調(diào)用的開銷。而 a == b 則是等同于a.eq(b),繼承自 object 的 eq 方法原本也是比較兩個(gè)對(duì)象的id,結(jié)果與 is 一樣,但大多數(shù)Python對(duì)象會(huì)覆蓋重寫object的 eq 方法,而定義內(nèi)容的相關(guān)比較,所以比較的是對(duì)象屬性的值。

在變量和單例值之間比較時(shí),應(yīng)該使用 is。目前,最常使用 is 的地方是當(dāng)判斷對(duì)象是不是 None,下面是推薦的寫法: xxx is None;判斷不是None的推薦寫法是: xxx is not None

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产成人综合亚洲动漫在线 | 久久在草 | 亚洲国产精品一区二区久 | 天天爱添天天爱添天天爱添 | 国产一区二区三区不卡免费观看 | 天天草夜夜 | 五月天婷婷一区二区三区久久 | 青青草免费在线视频 | 国产精品一区二区综合 | 97se亚洲综合在线天天 | 久草青青在线 | 中文字幕91 | 天堂网一区 | 国内一区亚洲综合图区欧美 | 毛片在线高清免费观看 | 成人免费黄色片 | 99久久精品免费精品国产 | 亚洲精品国产福利一区二区三区 | 亚洲欧洲日本在线观看 | 欧美一级α片毛片免费观看 | 白云精品视频国产专区 | 伦理片爱久久 | 亚洲另类老妇videos | 一级大片视频 | 亚洲婷婷综合中文字幕第一页 | 天天拍拍天天爽免费视频 | 狠狠色噜噜狠狠狠8888米奇 | 天天干天天色天天干 | 亚洲欧美在线综合一区二区三区 | 97啪啪| 看免费5xxaaa毛片30厘米 | 国产精品免费入口视频 | 狠狠色狠狠色很很综合很久久 | 尤物视频在线观看视频 | 精品国产免费观看久久久 | 亚洲精品中文字幕一区在线 | 一二区| 精品久久久日韩精品成人 | 波多野结衣中文一区二区免费 | 中文字幕日韩女同互慰视频 | 免费观看呢日本天堂视频 |