国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Python > 正文

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

2024-09-09 19:02:50
字體:
來源:轉載
供稿:網(wǎng)友

is 和 ==

先了解下官方文檔中關于 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。

相關示例

示例一

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) # 輸出 Falseprint(a == b) # 輸出 True 

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

示例三

a = 'ab' + 'c' is 'abc'print(a) # 輸出 Trueab = '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) # 輸出 Falseprint(a == b) # 輸出 True 

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

示例五

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

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

示例六

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄冈市| 延长县| 黄陵县| 新津县| 阿拉尔市| 屯留县| 加查县| 沁源县| 黄梅县| 若羌县| 武定县| 团风县| 府谷县| 达州市| 定襄县| 达孜县| 黔南| 绥芬河市| 垣曲县| 巴马| 鄂尔多斯市| 赣州市| 建水县| 仁布县| 汕头市| 溧水县| 精河县| 石门县| 兴山县| 莲花县| 遂川县| 汉源县| 综艺| 大渡口区| 正镶白旗| 潮州市| 英山县| 龙海市| 长白| 仪征市| 昆山市|