ホームページ > バックエンド開発 > Python チュートリアル > 連続して作成された複数の Python オブジェクトが同じ ID を共有する場合があるのはなぜですか?

連続して作成された複数の Python オブジェクトが同じ ID を共有する場合があるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-17 07:05:25
オリジナル
379 人が閲覧しました

Why Do Multiple Python Objects Created in Quick Succession Sometimes Share the Same ID?

Python における同一のオブジェクト ID: 謎の解明

同じクラスから複数のオブジェクトを連続してインスタンス化すると、Python ではそれらが同じ ID を共有することが観察されます。各オブジェクトには一意の識別子があると予想されるため、この動作は直感に反するように見えるかもしれません。

オブジェクト ID について

Python では、id() 関数はオブジェクトのメモリ アドレスを返します。このアドレスはオブジェクトの ID として機能し、その存続期間中は一意であることが保証されます。ただし、立て続けに作成されたオブジェクトは隣接するメモリ位置に常駐する可能性があり、結果として ID が同一になります。

実装の詳細

Python の CPython 実装では、ガベージ コレクションに参照カウントが使用されます。その結果、オブジェクトの参照カウントがゼロになると、オブジェクトの割り当てをすぐに解除できます。説明されているシナリオでは、両方の someClass() オブジェクトが作成され、print() 呼び出し後に参照されなくなるため、ガベージ コレクターによってすぐに破棄されます。

メモリ割り当てと ID 共有

さらに、CPython はオブジェクトへの基になるポインターの値に基づいて ID を割り当てます。最初の someClass() オブジェクトの割り当てが解除されると、そのメモリ位置が再割り当てに使用できるようになります。その結果、次に作成されるオブジェクト (2 番目の someClass() オブジェクト) は、前のオブジェクトの ID を継承して同じ場所に配置される可能性があります。

問題の解決

共有を避けるにはID を取得し、個別のオブジェクト識別子を維持するには、次のいずれかを行うことをお勧めします。

  • オブジェクトをリストまたは他のデータに保存してメモリ内に保持する
  • カウンタまたは一意性を保証するその他のロジックを使用して、クラス内にカスタム ID 生成メカニズムを実装します。

これらの実装の微妙な違いを理解することで、プログラマーは回避できます。効率的なオブジェクト管理のために Python を使用しながら、同一のオブジェクト ID に依存します。

以上が連続して作成された複数の Python オブジェクトが同じ ID を共有する場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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