Python中字串的intern機制

2022-04-25 17:26:42 字數 2440 閱讀 6506

intern機制:

字串型別作為python中最常用的資料型別之一,python直譯器為了提高字串使用的效率和使用效能,做了很多優化,例如:python直譯器中使用了 intern(字串駐留)的技術來提高字串效率,什麼是intern機制?即值同樣的字串物件僅僅會儲存乙份,放在乙個字串儲蓄池中,是共用的,當然,肯定不能改變,這也決定了字串必須是不可變物件。

簡單原理:

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

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

1.在shell中示例,並非全部的字串都會採用intern機制。僅僅包括下劃線、數字、字母的字串才會被intern,當然不能超過20個字元。因為如果超過20個字元的話,直譯器認為這個字串不常用,不用放入字串池中。

>>> s1="

hello

">>> s2="

hello

">>> s1 is

s2true

# 如果有空格,預設不啟用intern機制

>>> s1="

hell o

">>> s2="

hell o

">>> s1 is

s2false

# 如果乙個字串長度超過20個字元,不啟動intern機制

>>> s1 = "

a" * 20

>>> s2 = "

a" * 20

>>> s1 is

s2true

>>> s1 = "

a" * 21

>>> s2 = "

a" * 21

>>> s1 is

s2false

>>> s1 = "

ab" * 10

>>> s2 = "

ab" * 10

>>> s1 is

s2true

>>> s1 = "

ab" * 11

>>> s2 = "

ab" * 11

>>> s1 is

s2false

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" * 20s2 = "

a" * 20

print(s1 is s2) #

true

s1 = "

a" * 21s2 = "

a" * 21

print(s1 is s2) #

false

s1 = "

ab" * 10s2 = "

ab" * 10

print(s1 is s2) #

true

s1 = "

ab" * 11s2 = "

ab" * 11

print(s1 is s2) #

false

3.字串拼接時,涉及編譯執行問題

>>> s1 = "

hell

">>> s2 = "

hello

">>> s1 + "o"

iss2

false

>>> "

hell

" + "o"

is s2true

>>># 說明shell和ide在這方面沒有差異

s1 = "

hell

"s2 = "

hello

"print(s1 + "o"

is s2) #

false

print("

hell

" + "o"

iss2) #

true

#因為"hell" + "o"在編譯時已經變成了"hello",而s1+"o"因為s1是乙個變數,他們會在執行時進行拼接,所以沒有被intern

python中的字串

方法1 用字串的join方法 a a b c d content content join a print content 方法2 用字串的替換佔位符替換 a a b c d content content s s s s tuple a print content 我們可以通過索引來提取想要獲取的...

python中的字串

b nihao hahah xixi 輸出 nihao nhahah nxixi n 原字串 big r this hhaha big輸出 this nhhaha 還原為unicode字串 hello u hello u0020world hello輸出 hello world 字串是不可以改變的 ...

python中的字串

字串連線操作 字串複製操作 字串索引操作,通過索引訪問指定位置的字元,索引從0開始 字串取片操作 完整格式 開始索引 結束索引 間隔值 結束索引 從開頭擷取到結束索引之前 開始索引 從開始索引擷取到字串的最後 開始索引 結束索引 從開始索引擷取到結束索引之前 擷取所有字串 開始索引 結束索引 間隔值...