淺析Python中字符串的intern機(jī)制
intern機(jī)制:
字符串類型作為Python中最常用的數(shù)據(jù)類型之一,Python解釋器為了提高字符串使用的效率和使用性能,做了很多優(yōu)化,例如:Python解釋器中使用了 intern(字符串駐留)的技術(shù)來(lái)提高字符串效率,什么是intern機(jī)制?即值同樣的字符串對(duì)象僅僅會(huì)保存一份,放在一個(gè)字符串儲(chǔ)蓄池中,是共用的,當(dāng)然,肯定不能改變,這也決定了字符串必須是不可變對(duì)象。
簡(jiǎn)單原理:
實(shí)現(xiàn) Intern 機(jī)制的方式非常簡(jiǎn)單,就是通過(guò)維護(hù)一個(gè)字符串儲(chǔ)蓄池,這個(gè)池子是一個(gè)字典結(jié)構(gòu),如果字符串已經(jīng)存在于池子中就不再去創(chuàng)建新的字符串,直接返回之前創(chuàng)建好的字符串對(duì)象,如果之前還沒(méi)有加入到該池子中,則先構(gòu)造一個(gè)字符串對(duì)象,并把這個(gè)對(duì)象加入到池子中去,方便下一次獲取。
但是,解釋器內(nèi)部對(duì)intern 機(jī)制的使用策略是有考究的,有些場(chǎng)景會(huì)自動(dòng)使用intern ,有些地方需要通過(guò)手動(dòng)方式才能啟動(dòng),看下面幾個(gè)常見(jiàn)的小陷阱。
- 1.在shell中示例,并非全部的字符串都會(huì)采用intern機(jī)制。僅僅包括下劃線、數(shù)字、字母的字符串才會(huì)被intern,當(dāng)然不能超過(guò)20個(gè)字符。因?yàn)槿绻^(guò)20個(gè)字符的話,解釋器認(rèn)為這個(gè)字符串不常用,不用放入字符串池中。
>>> s1="hello" >>> s2="hello" >>> s1 is s2 True# 如果有空格,默認(rèn)不啟用intern機(jī)制 >>> s1="hell o" >>> s2="hell o" >>> s1 is s2 False# 如果一個(gè)字符串長(zhǎng)度超過(guò)20個(gè)字符,不啟動(dòng)intern機(jī)制 >>> s1 = "a" * 20 >>> s2 = "a" * 20 >>> s1 is s2 True >>> s1 = "a" * 21 >>> s2 = "a" * 21 >>> s1 is s2 False >>> s1 = "ab" * 10 >>> s2 = "ab" * 10 >>> s1 is s2 True >>> s1 = "ab" * 11 >>> s2 = "ab" * 11 >>> s1 is s2 False
- 2.但是在PyCharm中,只要是同一個(gè)字符串不超過(guò)20個(gè)字符,都為True,并不用是下劃線、數(shù)字、字母的字符串。個(gè)人理解:IDE支持的不好。
s1 = "hell o" s2 = "hell o" print(s1 is s2) # True s1 = "hell!*o" s2 = "hell!*o" print(s1 is s2) # True s1 = "a" * 20 s2 = "a" * 20 print(s1 is s2) # True s1 = "a" * 21 s2 = "a" * 21 print(s1 is s2) # False s1 = "ab" * 10 s2 = "ab" * 10 print(s1 is s2) # True s1 = "ab" * 11 s2 = "ab" * 11 print(s1 is s2) # False
- 3.字符串拼接時(shí),涉及編譯運(yùn)行問(wèn)題
>>> s1 = "hell" >>> s2 = "hello" >>> s1 + "o" is s2 False >>> "hell" + "o" is s2 True >>> # 說(shuō)明shell和IDE在這方面沒(méi)有差異 s1 = "hell" s2 = "hello" print(s1 + "o" is s2) # False print("hell" + "o" is s2) # True#因?yàn)?hell" + "o"在編譯時(shí)已經(jīng)變成了"hello",而s1+"o"因?yàn)閟1是一個(gè)變量,他們會(huì)在運(yùn)行時(shí)進(jìn)行拼接,所以沒(méi)有被intern
作者:Nobita Chen
出處:http://www.cnblogs.com/chenshengkai/
以上就是淺析Python中字符串的intern機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于python 字符串的intern機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python cookbook(字符串與文本)在字符串的開(kāi)頭或結(jié)尾處進(jìn)行文本匹配操作
這篇文章主要介紹了Python cookbook(字符串與文本)在字符串的開(kāi)頭或結(jié)尾處進(jìn)行文本匹配操作,涉及Python使用str.startswith()和str.endswith()方法針對(duì)字符串開(kāi)始或結(jié)尾處特定文本匹配操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04Kears+Opencv實(shí)現(xiàn)簡(jiǎn)單人臉識(shí)別
這篇文章主要為大家詳細(xì)介紹了Kears+Opencv實(shí)現(xiàn)簡(jiǎn)單人臉識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08python實(shí)現(xiàn)rar解壓和壓縮的方法(附源碼)
數(shù)據(jù)量現(xiàn)在越來(lái)越大,壓縮文件在日常生活中很常用,這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)rar解壓和壓縮的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10詳解用TensorFlow實(shí)現(xiàn)邏輯回歸算法
本篇文章主要介紹了詳解用TensorFlow實(shí)現(xiàn)邏輯回歸算法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Django websocket原理及功能實(shí)現(xiàn)代碼
這篇文章主要介紹了Django websocket原理及功能實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11Python 輸出詳細(xì)的異常信息(traceback)方式
這篇文章主要介紹了Python 輸出詳細(xì)的異常信息(traceback)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04python tornado獲取請(qǐng)求參數(shù)的方法
在Tornado框架中,獲取請(qǐng)求參數(shù)包括查詢字符串參數(shù)、表單數(shù)據(jù)和JSON數(shù)據(jù)等,JSON數(shù)據(jù)通過(guò)直接訪問(wèn)self.request.json獲取,正確處理這些數(shù)據(jù)需要注意請(qǐng)求的Content-Type和數(shù)據(jù)格式,感興趣的朋友跟隨小編一起看看吧2024-09-09PyCharm2018 安裝及破解方法實(shí)現(xiàn)步驟
這篇文章主要介紹了PyCharm2018 安裝及破解方法實(shí)現(xiàn)步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-09-09