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

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

系統 1521 0

is 和 ==

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

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

字符串駐留機制

Python中的字符串采用了intern機制,當需要值相同的字符串的時候(比如標識符),可以直接從字符串池里拿來使用,避免頻繁的創建和銷毀,提升效率和節約內存,因此拼接和修改字符串是會比較影響性能的。

因為是不可變的,所以字符串的操作都不是replace,而是新建對象,這也是為什么拼接多字符串的時候不建議用+而用join(),join()是先計算出所有字符串的長度,然后再拷貝,只new一次對象。

需要注意的是,并不是所有的字符串都會采用intern機制,當且僅當只包含下劃線、數字、字母的字符串才會被intern。

相關示例

示例一

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

值相同的簡單字符串對象在字符串池里只會保存一份,這決定了字符串必須是不可變對象,所以a和b是同一個對象

示例二

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

a和b中都有空格,所以不會被intern(空格不是python標識符),故a和b不是同一個對象。注意,這僅僅是在交互式命令行中執行,而在PyCharm或者保存為文件執行,結果是不一樣的,主要是因為解釋器做了一部分優化

示例三

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

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

示例四

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

a和b是列表,不是同一個對象

示例五

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

把a的引用復制給b(引用賦值),在內存中其實是指向同一個對象

示例六

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

示例七

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

Python會對比較小的整數對象進行緩存,下次用的時候直接從緩存中獲取

示例八

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

Python僅僅對比較小的整數對象進行緩存(范圍為范圍[-5, 256]),而并非是所有整數對象。注意,這僅僅是在交互式命令行中執行,而在PyCharm或者保存為文件執行,結果是不一樣的,主要是因為解釋器做了一部分優化

is 與 == 對比

is 與 == 相比計算速度會更快,因為它不能重載,不用進行特殊的函數調用,通過直接比較兩個整數 id,減少了函數調用的開銷。而 a == b 則是等同于a.eq(b),繼承自 object 的 eq 方法原本也是比較兩個對象的id,結果與 is 一樣,但大多數Python對象會覆蓋重寫object的 eq 方法,而定義內容的相關比較,所以比較的是對象屬性的值。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲日日干 | 欧美成人性做爰 | 性欧洲精品videos' | 亚洲欧洲一区二区三区在线 | 中文字幕久久久久 | 国产成人在线小视频 | 国产欧美一区二区三区观看 | ass曰本人乱妇ass | 日本在线观看www | 亚洲国产精品久久久久网站 | 久久久久久久国产精品视频 | 日本黄色绿像 | 黄色毛片免费在线观看 | 97精品视频共享总站 | 91情国产l精品国产亚洲区 | 一级有奶水毛片免费看 | 国产一级毛片夜一级毛片 | 青青影院一区二区免费视频 | 网友自拍视频悠悠在线 | 久久精品免看国产成 | 亚洲高清毛片 | 色视频网站人成免费 | 成 人 黄 片 大全 | 在线日本中文字幕 | 精品久久久久久久 | 韩国亚洲伊人久久综合影院 | 夜夜夜夜夜夜夜猛噜噜噜噜噜噜 | 久久久久久久久一级毛片 | 国产欧美日韩精品第三区 | 国产原创精品 | 色黄啪啪网18以下勿入 | 中文字幕亚洲欧美 | 国产区1 | 精品中文字幕久久久久久 | 国产一级aaa全黄毛片 | 国产与自拍 | 久久久久久天天夜夜天天 | 国产成人精品男人免费 | 中文字幕亚洲无线码在线一区 | 性生活免费网站 | 久久精品视频免费在线观看 |