python學習字串駐留與常量摺疊隱藏特性詳解

2023-03-19 01:15:38 字數 1201 閱讀 7008

下面是python字串的一些微妙的特性,絕對會讓你大吃一驚。

案例一:

案例二:

案例三:

很好理解, 對吧?

說明:這些行為是由於 cpython 在編譯優化時, 某些情況下會嘗試使用已經存在的不可變物件而不是每次都建立一個新物件. (這種行為被稱作字串的駐留[string internin

發生駐留之後, 許多變數可能指向記憶體中的相同字串物件. (從而節省記憶體)

在上面的**中, 字串是隱式駐留的. 何時發生隱式駐留則取決於具體的實現. 這裡有一些方法可以用來猜測字串是否會被駐留

所有長度為 0 和長度為 1 的字串都被駐留.

字串在編譯時被實現 (‘wtf' 將被駐留, 但是 ‘'.join([‘w', ‘t', ‘f']) 將不會被駐留)

字串中只包含字母,數字或下劃線時將會駐留. 所以 ‘wtf!' 由於包含 ! 而未被駐留. 可以在【地址1】找到 cpython 對此規則的實現.

當在同一行將 a程式設計客棧 和 b 的值設定為 “wtf!” 的時候, python 直譯器會建立一個新物件, 然後同時引用第二個變數(譯: 僅適用於3.7以下, 詳細情況請看【地址2】). 如果你在不同的行上進行賦值操作, 它就不會“知道”已經有一個 wtf!物件 (因為 “wtf!” 不是按照上面提到的方式被隱式www.cppcns.com駐留的). 它是一種編譯器優化, 特別適用於互動式環境.\

常量摺疊(constant folding) 是 python 中的一種 窺孔優化(peephole optimization) 技術. 這意味著在編譯時表示式 ‘a'*20會被替換為 ‘aaaaaaaaaaaaaaaaaaaa' 以減少執行時的時鐘週期. 只www.cppcns.com有長度小於 20 的字串才會發生常量摺疊. (為啥? 想象一下由於表示式 ‘a'*10**10 而生成的 .pyc 檔案的大小). 相關的原始碼實現在【地址3】.

如果你是使用 3.7 版本中執行上述示例**, 會發現部分**的執行結果與註釋說明相同. 這是因為在 3.7 版本中, 常量摺疊已經從窺孔優化器遷移至新的 ast 優化器, 後者可以以更高的一致性來執行優化. (由 eugene toder 和 inada naoki 在 bpo-29469 和 bpo-11549 中貢獻.)

(譯: 但是在最新的 3.8 版本中, 結果又變回去了. 雖然 3.8 版本和 3.7 版本一樣, 都是使用 ast 優化器. 目前不確定官方對 3.8 版本的 ast 做了什麼調整.)

Python中的字串駐留

c 中的字串駐留 熟悉.net的人都應該知道c 中的字串駐留機制,net維護了一個駐留池,它會把在編譯期間就相同的字串只保留一份拷貝。如果僅在執行期間值才相同的字串變數,net不會為這個2個相同的字串變數指向同一份引用的。不過.net提供了一個方法,讓開發人員可以強制將兩個相同的字串指向同一個引用,...

python 字串駐留機制

1 字串長度為0或1時,預設採用駐留機制。2 字串長度大於1時,且字串中只包含大小寫字母 數字 下劃線時,採用駐留機制。3 字串只在編譯時進行駐留,而非執行時。python是解釋型語言,但是事實上,它的直譯器也可以是理解為是一種編譯器,它負責將python 翻譯成位元組碼,也就是.pyc檔案。4 用...

字串駐留機制

string s hello console.writeline object.referenceequals hello s 你猜顯示是true還是false,很多人會猜false,你看,不是有兩個 hello 物件嗎?可實際上應該是true,為什麼呢?下面解釋一下 其實clr初始化時,他會建立一...

Python 超詳細的字串駐留

一 什麼是字串駐留?字串駐留是一種僅儲存一份相同且不可變字串的方法。python 超詳細的字串駐留 基本原理 系統維護interned字典,記錄已被駐留的字串物件。當字串物件a需要駐留時,先在interned檢測是否存在,若存在則指向存在的字串物件,a的引用計數減1 若不存在,則記錄a到intern...

Python 駐留機制

1 coding utf 82 coding utf 83 coding utf 8 45 以上為註明字串的編碼格式 6 駐留機制 7 python支援短字串駐留機制,對於短字串,將其賦值給多個不同的物件時,記憶體中只有一個副本,多個物件共享該副本,8與其他型別數具有相同的特點。然而這一特點並不適用...

C 中字串駐留技術

msdn概念 公共語言執行庫通過維護一個表來存放字串,該表稱為拘留池,它包含程式中以程式設計方式宣告或建立的每個唯一的字串的一個引用。因此,具有特定值的字串的例項在系統中只有一個。上面的概念不好理解,我們還是從基礎說起 一 眾所周知,c 中的string是一個引用型別,string物件存放在堆上,而...

不駐留記憶體型病毒與駐留型有何不同?

駐留記憶體的病毒是一種立即傳染的病毒,每執行一次帶毒程式,就主動在當前路徑中搜尋,查到滿足要求的可執行檔案即進行傳染。該類病毒不修改中斷向量,不改動系統的任何狀態,因而很難區分當前執行的是一個病毒還是一個正常的程式。典型的病毒有 vienna 648。不駐留記憶體型病毒與駐留型病毒的不同在於前者是帶...

字串的駐留機制 字串的判斷和字串常用方法

字串駐留 僅儲存一份相同且不可變字串方法,不同的值被存放在字串駐留池中,python支援字串駐留機制,對於符合識別符號規則的字串 僅包含下劃線 字母和數字 會啟動字串駐留機制。例如 字串駐留機制 a abcd 11 d abcd 11 id a 2355133760208 id b 23551337...