同じクラスから複数のオブジェクトを連続してインスタンス化すると、Python ではそれらが同じ ID を共有することが観察されます。各オブジェクトには一意の識別子があると予想されるため、この動作は直感に反するように見えるかもしれません。
Python では、id() 関数はオブジェクトのメモリ アドレスを返します。このアドレスはオブジェクトの ID として機能し、その存続期間中は一意であることが保証されます。ただし、立て続けに作成されたオブジェクトは隣接するメモリ位置に常駐する可能性があり、結果として ID が同一になります。
Python の CPython 実装では、ガベージ コレクションに参照カウントが使用されます。その結果、オブジェクトの参照カウントがゼロになると、オブジェクトの割り当てをすぐに解除できます。説明されているシナリオでは、両方の someClass() オブジェクトが作成され、print() 呼び出し後に参照されなくなるため、ガベージ コレクターによってすぐに破棄されます。
さらに、CPython はオブジェクトへの基になるポインターの値に基づいて ID を割り当てます。最初の someClass() オブジェクトの割り当てが解除されると、そのメモリ位置が再割り当てに使用できるようになります。その結果、次に作成されるオブジェクト (2 番目の someClass() オブジェクト) は、前のオブジェクトの ID を継承して同じ場所に配置される可能性があります。
共有を避けるにはID を取得し、個別のオブジェクト識別子を維持するには、次のいずれかを行うことをお勧めします。
これらの実装の微妙な違いを理解することで、プログラマーは回避できます。効率的なオブジェクト管理のために Python を使用しながら、同一のオブジェクト ID に依存します。
以上が連続して作成された複数の Python オブジェクトが同じ ID を共有する場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。