Python の文字列 ID: インターンとメモリの再利用
Python では、文字列は不変です。ただし、最初の例で示したように、文字列リテラルの ID は評価を繰り返すと変更される可能性があります。この動作は、Python の内部文字列処理メカニズムとメモリ最適化戦略の組み合わせから生じます。
CPython のインターニング
CPython のドキュメントでは明示的に定義されていませんが、インタプリタは多くの場合文字列をインターンします。頻繁に使用されるもの。これには、共通に参照される文字列をグローバル テーブルに格納し、同一の文字列に対して同じメモリ位置を再利用することが含まれます。したがって、2 つの文字列リテラルが同じコード ブロックに出現するか、異なる変数にバインドされている場合、インターンされると同じ ID を共有する可能性があります。
メモリの再利用とガベージ コレクション
文字列オブジェクトが作成されると、そのメモリ位置は永続的にバインドされません。 Python のガベージ コレクターは、文字列オブジェクトを含む未使用のオブジェクトからメモリを再利用できます。文字列がコード内のどこでも参照されなくなった場合、そのメモリ位置は新しい文字列オブジェクトによって再利用できます。これにより、複数回評価されると、同じ文字列リテラルの ID が異なる可能性があります。
コンパイラの最適化
Python コンパイラは、実行時にコードの最適化を実行することがよくあります。特定の基準を満たす文字列リテラル (たとえば、ASCII 文字、数字、またはアンダースコアのみを含む) の場合、コンパイラーはそれらをインターンし、その作成を最適化することがあります。これは、最適化されたコード内で同じ文字列リテラルをその後評価すると、同じ ID が生成される可能性があることを意味します。
動的バインディングと文字列インターニング
変数がバインドされている場合文字列リテラルを使用すると、Python はインターンされた文字列を参照する新しいオブジェクトを作成します。変数名が前述の基準を満たしている場合、その変数もインターンされる可能性があり、その結果、変数名とその値が同じ ID を共有します。
連結とインターニング
Python で文字列を連結すると、結果の文字列がコンパイラの最適化制限 (Python では 4096 文字) 内に収まる場合、インターンが発生する場合があります。 3.7)。したがって、有効な識別子を生成し、制限内に収まる場合、連結された 2 つの文字列は同じ ID を持つ可能性があります。
以上がPython は文字列 ID をどのように管理しますか: インターン、メモリの再利用、最適化?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。