駐留機制節省大量的重復內存。在內部,小數據池是由壹個全局的dict 維護,該字典中的對象成了單例模式,從而節省內存。
變量 interned 就是全局存放字符串池的字典的變量名 interned = PyDict_New() ,為了讓 intern 機制中的字符串不被回收,設置字典時 PyDict_SetDefault(interned, s, s); 將字符串作為鍵同時也作為值進行設置,這樣對於字符串對象的引用計數就會進行兩次 +1 操作,這樣存於字典中的對象在程序結束前永遠不會為 0,這也是 y_REFCNT(s) -= 2; 將計數減 2 的原因。
從函數參數中可以看到其實字符串對象還是被創建了,內部其實始終會為字符串創建對象,但經過 inter 機制檢查後,臨時創建的字符串會因引用計數為 0 而被銷毀,臨時變量在內存中曇花壹現然後迅速消失。
指定要駐留的字符串:
為什麽要進行字符串駐留呢?
總結:
系統維護壹個interned全局字典,記錄已被駐留的字符串對象,當新字符串a對象需要駐留時,先在interned中查找是否存在,若存在則指向已存在的字符串對象,a對象的引用計數減1,若不存在,則記錄a對象到interned中。