ホームページ >バックエンド開発 >Python チュートリアル >不変の文字列 ID が Python 2.7 で変更されたように見えるのはなぜですか?

不変の文字列 ID が Python 2.7 で変更されたように見えるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-23 16:22:18352ブラウズ

Why Do Immutable String IDs Appear to Change in Python 2.7?

不変文字列の ID はなぜ変化するのですか?

Python 2.7 では、文字列 ID の動作が不可解になる場合があります。文字列は不変ですが、その ID は時間の経過とともに変化するようです。この記事では、この動作の背後にある理由を検討します。

Python での ID インターン

CPython は、デフォルトではすべての文字列をインターンしません。ただし、特定の基準を満たす文字列は、sys.intern() 関数または PyCode_New 関数の intern_string_constants() 呼び出しを使用してインターンされる場合があります。インインターンメントにより、コードベース内で同じ文字列が複数出現しても同じオブジェクトが使用されるようになります。

インターンの対象となる文字列には次のものがあります。

  • コード オブジェクトに格納されている定数
  • ASCII 文字、数字、またはアンダースコアのみを含む文字列
  • に割り当てられる文字列識別子とその値の両方 (例: so = 'so')

ID の変更

文字列がインターンの対象にならない場合、その ID は変化し続けます。これは、Python が新しい文字列のメモリ位置を自由に再利用できるため、同じリテラルに対して異なる ID が生成されるためです。

インターニングと文字列の使用法

ID の動作は依存します。文字列の使用方法:

  • 変数なし参照: id('so') を変数に割り当てずに複数回呼び出すと、インターンされた文字列オブジェクトが破棄されるため、ID が変更される可能性があります。
  • 変数参照の場合: 変数に文字列を代入した場合 (例: so = 'so')、インターンされた文字列がバインドされているため、ID は同じままになります。 variable.

文字列の連結

文字列の連結は ID にも影響します。オプティマイザーの制限内で文字列を連結するとインターン文字列が生成され、連結された文字列の ID が同じになる可能性があります。

結論

Python 2.7 における不変文字列の ID は次のとおりです。インターンのメカニズムとメモリの再利用により、常に同じであるとは限りません。これらの要素を理解すると、文字列 ID の明らかな不一致を明確にするのに役立ちます。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。