Python の文字列の不変性は、文字列が一度作成されると変更できないことを意味します。ただし、 id() 関数で表されるオブジェクトの ID は文字列に対して変更される可能性があるため、混乱が生じます。
一般に、文字列の id()同じ文字列リテラルであっても、呼び出されるたびに変更されます。これは、Python がデフォルトですべての文字列をインターンすることを保証していないためです。
id('so') 140614155123888 id('so') 140614155123848 id('so') 140614155123808
ただし、例外もあります。次の条件を満たす文字列はインターンされ、同じ id() が維持されます。
変数の割り当て文字列を変数に追加すると、その id() の動作に影響を与える可能性があります。変数が文字列を参照する場合、Python はインターンされたバージョンを使用して文字列の値をメモリに一度保存することでパフォーマンスを最適化します。
so = 'so' id('so') # Now references the same interned string as 'so' 140614155123728
Python は内部で関数を使用して、 intern_string_constants() と呼ばれるインターン文字列。この関数は、前述の基準を満たす文字列 (例では「hello」など) に適用されます。
Python のコンパイラーとオプティマイザーもインターニングで役割を果たします。コード オブジェクト ファクトリ関数は、有効な識別子 (たとえば、2 番目の例の「so」) として表現できる任意の文字列をインターンできます。さらに、ピープホールまたは AST オプティマイザーは、定数を含む単純な式を折りたたんで、インターンされた結果を導くことができます。
Python の文字列は不変ですが、その id() は、次のような要因に応じて変更される可能性があります。インターン、変数スコープ、オプティマイザーの動作。インターンはメモリ使用量とパフォーマンスの最適化に役立ち、潜在的な混乱を避けるためにその動作を理解することが重要です。
以上が不変文字列に対して Python の `id()` が変更されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。