小整數池以及字串駐留機制

2022-06-15 16:30:12 字數 1368 閱讀 4824

在[-5,256]這個區間的整數,在記憶體中僅僅會存放乙份。

舉例說明:

在python中,兩次重複宣告乙個內容一樣的變數的時候,其id( )是不一樣的

但是如果在宣告整數的時候,數字是在[-5,256]這個區間的整數,其在記憶體中就僅僅存放了乙份,所以id()是一樣的

但是僅僅限於整數,如果是小數則不會觸發

前面講了小整數池,在一定範圍內的整數,在記憶體中只會儲存乙份,所以導致了在[-5,256]範圍的數字,就算用不同變數宣告,記憶體中都是指向的同乙個位址。

同理,值同樣的字串物件也僅僅會儲存乙份,是共用的。(這也決定了字串必須是不可變物件)

但是同小整數池 有區間範圍一樣,字串駐留機制也不是 對所有的字串生效,僅僅是數字、字母或者下劃線組成的字串才存在intern機制

(intern機制僅僅對那些看起來像是python識別符號的字串物件才會觸發)

舉例說明:

注意的點:駐留時機 是在編譯的時候駐留的,而不是在執行的時候駐留的

舉例說明:

上述例子中,'ab'+'c'是在編譯的時候求值的,而 變數b + 'c' 是在執行的時候求值的。由於駐留時機是在編譯的時候產生,所以b + 'c' 並不會自動去intern

駐留優缺點:

python識別符號的不可變性導致了字串的改動不是採用replace,而是重新建立物件。為了節省記憶體,涉及到字串的改動時通常用join()而非+。因為+會多次建立物件,而join()只建立一次物件。(不推薦使用+來拼接字串,推薦使用join函式,因為join函式在拼接字串之前會計算所有字串的長度,然後逐一拷貝,僅新建一次物件。)其實在比較少的字串拼接用+反而效率更高,不過如果很多字串拼接的話還是用join比較合適

駐留機制會提公升一些時間和空間上的效能,但駐留物件也有所消耗。

以上所有的測試結果都是在命令列中執行得到的,在一些工具中做了優化,比如在pycharm中 a=1000 b=1000  a is b  返回true,這是因為工具的優化導致的

關於字串駐留

首先看幾個例子 示例1 static void main 示例2 static void main 示例3 public const string s1 abc static void main 示例4 public static string s1 abc static void main 示例1...

字串駐留備忘

下面是個人的練習 字串拘留練習 by mcjeremy 宣告s1時,拘留池中沒有該字串,因此將它放進去 放進去後,string.isintered s1 將返回該字串值 string s1 abc123 宣告s2時,由於拘留池中已經有該字串存在,因此不再分配記憶體 s2和s1將指向同乙個引用 str...

C 字串的記憶體分配與駐留池

剛開始學習c 的時候,就聽說clr對於string類有一種特別的記憶體管理機制 有時候,明明宣告了兩個string類的物件,但是他們偏偏卻指向同乙個例項。如下 string s1 hello string s2 hello s2和s1的實際值都是 hello bool same object s1 ...