首頁 > 後端開發 > Python教學 > 為什麼 Python 的 id() 會改變不可變字串?

為什麼 Python 的 id() 會改變不可變字串?

Mary-Kate Olsen
發布: 2024-12-02 02:23:11
原創
907 人瀏覽過

Why Does Python's `id()` Change for Immutable Strings?

Python 字串中的可變性和物件標識

Python 字串的不變性意味著它們一旦創建就無法更改。然而,由 id() 函數表示的物件標識對於字串來說可能會發生變化,從而導致混亂。

字串的 id() 行為

一般來說,字串的 id()每次呼叫時都會發生變化,即使對於相同的字串文字也是如此。這是因為 Python 不保證預設實習所有字串。

id('so')
140614155123888
id('so')
140614155123848
id('so')
140614155123808
登入後複製

但是,也有例外。滿足以下條件的字串將被保留並保持相同的id():

  • 儲存在程式碼物件中的常數
  • 僅包含ASCII 字母、數字或底線的字串

變數作用域與實習

將字串指派給變數可以影響其id() 行為。當變數引用字串時,Python 透過使用內部版本將字串的值儲存在記憶體中一次來優化效能。

so = 'so'
id('so')  # Now references the same interned string as 'so'
140614155123728
登入後複製

Interning 行為的來源

Python 內部使用一個函數來稱為 intern_string_constants() 的內部字串。此函數適用於滿足前面提到的條件的字串(例如,範例中的“hello”)。

實習和最佳化

Python 的編譯器和最佳化器也在實習中發揮作用。程式碼物件工廠函數可以保留任何可以表示為有效標識符的字串(例如,第二個範例中的“so”)。此外,窺視孔或 AST 優化器可以折疊涉及常數的簡單表達式,從而產生中間結果。

結論

雖然 Python 的字串是不可變的,但它們的 id() 可以改變,取決於以下因素:實習、變數範圍和最佳化器行為。實習有助於優化記憶體使用和效能,了解其行為以避免潛在的混亂非常有價值。

以上是為什麼 Python 的 id() 會改變不可變字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板