Python における不変文字列の ID の変化について理解する
Python では、通常、文字列インターニングなどの要因により、不変文字列オブジェクトの ID が変化します。 、メモリ位置の再利用、コードの最適化。不変性は ID が一定であることを示唆していますが、次の動作が観察されています:
元の観察:
id('so') # Changes on every call
ID の変更:
この動作は、CPython で文字列インターンが保証されていないことが原因で発生します。 Python は常に文字列をインターンするわけではないため、id('so') を繰り返し呼び出すと異なる ID が生成される可能性があります。
メモリ位置の再利用:
Python はメモリ位置を再利用できます。新しい文字列オブジェクトが生成されるため、異なる文字列であっても ID が一致する場合があります。これは予測できず、メモリ使用量によって異なります。
コードの最適化:
Python オプティマイザーはコンパイル時に定数式 (例: 'foo' 'bar') を折りたたむことがあります。結果の文字列を単一のメモリ場所に保存します。これにより、これらの式の ID が一貫したものになります。
例外:
ASCII 文字、数字、またはアンダースコアを使用する定数文字列は、Python コンパイラによってインターンされます。したがって、同じ文字を持つ後続のリテラルは同じインターンされた文字列オブジェクトを再利用し、一貫した ID が得られます。
追加の観察:
以上が不変の Python 文字列の ID が変化しているように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。