ホームページ > バックエンド開発 > Python チュートリアル > 不変文字列に対して Python の `id()` が変更されるのはなぜですか?

不変文字列に対して Python の `id()` が変更されるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-02 02:23:11
オリジナル
965 人が閲覧しました

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

Python 文字列の可変性とオブジェクトの同一性

Python の文字列の不変性は、文字列が一度作成されると変更できないことを意味します。ただし、 id() 関数で表されるオブジェクトの 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
ログイン後にコピー

インターニング動作のソース

Python は内部で関数を使用して、 intern_string_constants() と呼ばれるインターン文字列。この関数は、前述の基準を満たす文字列 (例では「hello」など) に適用されます。

インターニングと最適化

Python のコンパイラーとオプティマイザーもインターニングで役割を果たします。コード オブジェクト ファクトリ関数は、有効な識別子 (たとえば、2 番目の例の「so」) として表現できる任意の文字列をインターンできます。さらに、ピープホールまたは AST オプティマイザーは、定数を含む単純な式を折りたたんで、インターンされた結果を導くことができます。

結論

Python の文字列は不変ですが、その id() は、次のような要因に応じて変更される可能性があります。インターン、変数スコープ、オプティマイザーの動作。インターンはメモリ使用量とパフォーマンスの最適化に役立ち、潜在的な混乱を避けるためにその動作を理解することが重要です。

以上が不変文字列に対して Python の `id()` が変更されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート