您好,登錄后才能下訂單哦!
這篇文章主要介紹Python中is和 ==以及字符串駐留機制的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
is 和 ==
先了解下官方文檔中關(guān)于 is 和 == 的概念。is 表示的是對象標示符(object identity),而 == 表示的是相等(equality);is 的作用是用來檢查對象的標示符是否一致,也就是比較兩個對象在內(nèi)存中的地址是否一樣(相當于檢查 id(a) == id(b)),而 == 是用來檢查兩個對象引用的值是否相等(相當于檢查 a.eq(b));這點和Java有點類似,只不過Java中是用 == 來比較兩個對象在內(nèi)存中的地址,用 equals() 來檢查兩者之間的值是否相等。
is | == | |
---|---|---|
概念 | 對象標示符 | 相等 |
作用 | 比較對象在內(nèi)存中的地址 | 檢查兩個對象引用的值 |
示例 | id(a) == id(b) | a.eq(b) |
字符串駐留機制
Python中的字符串采用了intern機制,當需要值相同的字符串的時候(比如標識符),可以直接從字符串池里拿來使用,避免頻繁的創(chuàng)建和銷毀,提升效率和節(jié)約內(nèi)存,因此拼接和修改字符串是會比較影響性能的。
因為是不可變的,所以字符串的操作都不是replace,而是新建對象,這也是為什么拼接多字符串的時候不建議用+而用join(),join()是先計算出所有字符串的長度,然后再拷貝,只new一次對象。
需要注意的是,并不是所有的字符串都會采用intern機制,當且僅當只包含下劃線、數(shù)字、字母的字符串才會被intern。
相關(guān)示例
示例一
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不是同一個對象。注意,這僅僅是在交互式命令行中執(zhí)行,而在PyCharm或者保存為文件執(zhí)行,結(jié)果是不一樣的,主要是因為解釋器做了一部分優(yōu)化
示例三
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(運行期)拼接的,導(dǎo)致沒有被自動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的引用復(fù)制給b(引用賦值),在內(nèi)存中其實是指向同一個對象
示例六
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相同。由于切片拷貝是淺拷貝,這說明列表中的元素并未重新創(chuàng)建,因此a[0] is b[0]輸出為True
示例七
a = 1 b = 1 print(a is b) # 輸出 True print(a == b) # 輸出 True
Python會對比較小的整數(shù)對象進行緩存,下次用的時候直接從緩存中獲取
示例八
a = 320 b = 320 print(a is b) # 輸出 False print(a == b) # 輸出 True
Python僅僅對比較小的整數(shù)對象進行緩存(范圍為范圍[-5, 256]),而并非是所有整數(shù)對象。注意,這僅僅是在交互式命令行中執(zhí)行,而在PyCharm或者保存為文件執(zhí)行,結(jié)果是不一樣的,主要是因為解釋器做了一部分優(yōu)化
is 與 == 對比
is 與 == 相比計算速度會更快,因為它不能重載,不用進行特殊的函數(shù)調(diào)用,通過直接比較兩個整數(shù) id,減少了函數(shù)調(diào)用的開銷。而 a == b 則是等同于a.eq(b),繼承自 object 的 eq 方法原本也是比較兩個對象的id,結(jié)果與 is 一樣,但大多數(shù)Python對象會覆蓋重寫object的 eq 方法,而定義內(nèi)容的相關(guān)比較,所以比較的是對象屬性的值。
在變量和單例值之間比較時,應(yīng)該使用 is。目前,最常使用 is 的地方是當判斷對象是不是 None,下面是推薦的寫法: xxx is None;判斷不是None的推薦寫法是: xxx is not None
以上是“Python中is和 ==以及字符串駐留機制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。