複数のオブジェクトの同じ ID: Python の奇妙な動作
Python では、名前を割り当てずに複数のオブジェクトを作成すると、実際にオブジェクトが共有される可能性があります。同じID。この明らかな矛盾は、オブジェクトの ID がその存続期間内でのみ一意であるという事実から生じています。
someClass() など、オブジェクトを参照する変数を作成すると、オブジェクトの存続期間は変数が作成された時点から始まります。が割り当てられ、範囲外になると終了します。あなたが提供した例では:
print(someClass()) print(someClass())
2 つの someClass() 呼び出しにより 2 つのオブジェクトが生成されますが、それらは両方とも同じ print 呼び出し内で作成および破棄されます。したがって、これらは同じライフタイムを共有し、同じ ID を持つことができます。
この動作は、Python 3.3.3 でガベージ コレクションに参照カウントが使用されることでさらに強調されます。オブジェクトの参照カウントがゼロになると (つまり、オブジェクトを参照する変数がなくなると)、そのオブジェクトは削除の対象になります。この例では、someClass() への 2 回目の呼び出しにより、最初のオブジェクトの参照カウントが 0 になり、即時割り当て解除の対象になります。
次に割り当てられるオブジェクトは同じメモリ位置に配置されるため、最初のオブジェクトと同じ ID になります。これは、同じクラスを連続して複数回呼び出すと、同じ ID を持つオブジェクトが生成される理由を説明しています。
オブジェクトに一意の ID が必要な場合は、明示的に変数に割り当てて保持することで、この動作を克服できます。 :
a = someClass() b = someClass() print(id(a)) print(id(b))
ここで、a と b は、たとえ同じクラスに属していても、異なる ID を持つ別個のオブジェクトを参照します。あるいは、独自のクラス固有の ID メカニズムを実装して、一意性を確保することもできます。
以上が複数の Python オブジェクトが同じ ID を共有する場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。