欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2019年06月28日 11:26:06   作者:happyJared  
這篇文章主要介紹了Python中的 is 和 == 以及字符串駐留機(jī)制詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

is 和 ==

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

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

字符串駐留機(jī)制

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

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

需要注意的是,并不是所有的字符串都會采用intern機(jī)制,當(dāng)且僅當(dāng)只包含下劃線、數(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標(biāo)識符),故a和b不是同一個對象。注意,這僅僅是在交互式命令行中執(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

第一個'ab'+'c'是在compile-time(編譯期)求值的,被替換成了'abc',所以輸出為True;第二個示例,ab+'c'是在run-time(運(yùn)行期)拼接的,導(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(bǔ)的引用復(fù)制給b(引用賦值),在內(nèi)存中其實(shí)是指向同一個對象

示例六

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ù)對象進(jìn)行緩存,下次用的時候直接從緩存中獲取

示例八

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

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

is 與 == 對比

is 與 == 相比計(jì)算速度會更快,因?yàn)樗荒苤剌d,不用進(jìn)行特殊的函數(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 的地方是當(dāng)判斷對象是不是 None,下面是推薦的寫法: xxx is None;判斷不是None的推薦寫法是: xxx is not None

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

相關(guān)文章

  • Python函數(shù)的參數(shù)常見分類與用法實(shí)例詳解

    Python函數(shù)的參數(shù)常見分類與用法實(shí)例詳解

    這篇文章主要介紹了Python函數(shù)的參數(shù)常見分類與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python函數(shù)的形參、實(shí)參、默認(rèn)參數(shù)、可變參數(shù)等概念、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • python實(shí)現(xiàn)在sqlite動態(tài)創(chuàng)建表的方法

    python實(shí)現(xiàn)在sqlite動態(tài)創(chuàng)建表的方法

    這篇文章主要介紹了python實(shí)現(xiàn)在sqlite動態(tài)創(chuàng)建表的方法,涉及Python操作SQLite數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)表的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • python實(shí)現(xiàn)隨機(jī)漫步算法

    python實(shí)現(xiàn)隨機(jī)漫步算法

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)隨機(jī)漫步算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • python數(shù)據(jù)結(jié)構(gòu)之搜索講解

    python數(shù)據(jù)結(jié)構(gòu)之搜索講解

    這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)之搜索講解,搜索是指從元素集合中找到某個特定元素的算法過程。搜索過程通常返回?True?或?False,?分別表示元素是否存在,下面一起來了解文章的詳細(xì)內(nèi)容吧,希望對你有所幫助
    2021-12-12
  • Python中如何自定義函數(shù)

    Python中如何自定義函數(shù)

    這篇文章主要介紹了Python中如何自定義函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python基于pyCUDA實(shí)現(xiàn)GPU加速并行計(jì)算功能入門教程

    Python基于pyCUDA實(shí)現(xiàn)GPU加速并行計(jì)算功能入門教程

    這篇文章主要介紹了Python基于pyCUDA實(shí)現(xiàn)GPU加速并行計(jì)算功能,結(jié)合實(shí)例形式分析了Python使用pyCUDA進(jìn)行GPU加速并行計(jì)算的原理與相關(guān)實(shí)現(xiàn)操作技巧,需要的朋友可以參考下
    2018-06-06
  • python 邊緣擴(kuò)充方式的實(shí)現(xiàn)示例

    python 邊緣擴(kuò)充方式的實(shí)現(xiàn)示例

    本文主要介紹了python 邊緣擴(kuò)充方式的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Django 模板中常用的過濾器實(shí)現(xiàn)

    Django 模板中常用的過濾器實(shí)現(xiàn)

    在模版中,有時候需要對一些數(shù)據(jù)進(jìn)行處理以后才能使用。一般在Python中我們是通過函數(shù)的形式來完成的。而在模版中,則是通過過濾器來實(shí)現(xiàn)的,本文就來介紹一下如何實(shí)現(xiàn)
    2021-05-05
  • python3反轉(zhuǎn)字符串的3種方法(小結(jié))

    python3反轉(zhuǎn)字符串的3種方法(小結(jié))

    這篇文章主要介紹了python3反轉(zhuǎn)字符串的3種方法(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 詳解使用scrapy進(jìn)行模擬登陸三種方式

    詳解使用scrapy進(jìn)行模擬登陸三種方式

    這篇文章主要介紹了使用scrapy進(jìn)行模擬登陸三種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評論