91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

淺析Python中字符串的intern機制

發布時間:2020-10-20 17:38:06 來源:腳本之家 閱讀:137 作者:NobitaChen 欄目:開發技術

intern機制:

  字符串類型作為Python中最常用的數據類型之一,Python解釋器為了提高字符串使用的效率和使用性能,做了很多優化,例如:Python解釋器中使用了 intern(字符串駐留)的技術來提高字符串效率,什么是intern機制?即值同樣的字符串對象僅僅會保存一份,放在一個字符串儲蓄池中,是共用的,當然,肯定不能改變,這也決定了字符串必須是不可變對象。

簡單原理:

  實現 Intern 機制的方式非常簡單,就是通過維護一個字符串儲蓄池,這個池子是一個字典結構,如果字符串已經存在于池子中就不再去創建新的字符串,直接返回之前創建好的字符串對象,如果之前還沒有加入到該池子中,則先構造一個字符串對象,并把這個對象加入到池子中去,方便下一次獲取。

但是,解釋器內部對intern 機制的使用策略是有考究的,有些場景會自動使用intern ,有些地方需要通過手動方式才能啟動,看下面幾個常見的小陷阱。

  • 1.在shell中示例,并非全部的字符串都會采用intern機制。僅僅包括下劃線、數字、字母的字符串才會被intern,當然不能超過20個字符。因為如果超過20個字符的話,解釋器認為這個字符串不常用,不用放入字符串池中。
>>> s1="hello"
>>> s2="hello"
>>> s1 is s2
True# 如果有空格,默認不啟用intern機制
>>> s1="hell o"
>>> s2="hell o"
>>> s1 is s2
False# 如果一個字符串長度超過20個字符,不啟動intern機制
>>> 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中,只要是同一個字符串不超過20個字符,都為True,并不用是下劃線、數字、字母的字符串。個人理解: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.字符串拼接時,涉及編譯運行問題
>>> s1 = "hell"
>>> s2 = "hello"
>>> s1 + "o" is s2
False
>>> "hell" + "o" is s2
True
>>>
# 說明shell和IDE在這方面沒有差異
s1 = "hell"
s2 = "hello"
print(s1 + "o" is s2) # False
print("hell" + "o" is s2) # True#因為"hell" + "o"在編譯時已經變成了"hello",而s1+"o"因為s1是一個變量,他們會在運行時進行拼接,所以沒有被intern

作者:Nobita Chen
出處:http://www.cnblogs.com/chenshengkai/

以上就是淺析Python中字符串的intern機制的詳細內容,更多關于python 字符串的intern機制的資料請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万年县| 融水| 土默特右旗| 中江县| 汪清县| 淮北市| 五河县| 宣化县| 宁夏| 宁国市| 新巴尔虎右旗| 金溪县| 阿巴嘎旗| 延寿县| 平远县| 奉化市| 台前县| 公主岭市| 开远市| 荃湾区| 常熟市| 遵义县| 郎溪县| 章丘市| 平潭县| 会昌县| 乳山市| 邻水| 施甸县| 郁南县| 阜南县| 汪清县| 忻州市| 宁津县| 武宁县| 浦县| 疏附县| 秀山| 东乡| 合阳县| 绥江县|