ホームページ > バックエンド開発 > Python チュートリアル > 複数の名前のない Python オブジェクトが同じ ID を共有する場合があるのはなぜですか?

複数の名前のない Python オブジェクトが同じ ID を共有する場合があるのはなぜですか?

DDD
リリース: 2024-12-15 03:12:14
オリジナル
370 人が閲覧しました

Why Do Multiple Unnamed Python Objects Sometimes Share the Same ID?

Python のオブジェクト ID: 複数の名前のないオブジェクトが同じ ID を共有する理由

Python で特定のクラスの複数のオブジェクトを作成する場合、各インスタンスが一意の ID (ID) を持つことを期待します。ただし、特定の状況下では、名前のないオブジェクトが連続して作成されると、それらのオブジェクトが同じ ID を持つことになります。

オブジェクトの有効期間と ID について

オブジェクトの ID は、オブジェクトの ID を表します。メモリ内のユニークな場所。ただし、この ID が一意であることが保証されるのは、プログラムの実行中ではなく、オブジェクトの存続期間中のみです。

この例では、print:

print(someClass())
print(someClass())
ログイン後にコピー
print が返されると、作成されたオブジェクトはどの変数からも参照されなくなり、ガベージ コレクションの対象になります。 Python の CPython 実装では、それらは事実上即座に割り当て解除されます。

CPython 実装の詳細

Python のガベージ コレクションは、参照カウントによって発生します。さらに、オブジェクトの ID はそのメモリ位置に関連付けられます。最初の名前のないオブジェクトの割り当てが解除されると、そのオブジェクトが占有していたメモリ位置が使用可能になります。

その結果、次に作成されるオブジェクトは同じメモリ位置に配置され、両方のオブジェクトに同じ ID が割り当てられます。

解決策

オブジェクトの個別の ID を確保するには、オブジェクトへの参照をリストに保持するか、実装することを検討してください。適切な保証を提供するクラス固有の ID (次のようなもの):

class SomeClass:
    next_id = 0

    def __init__(self):
         self.id = SomeClass.nextid
         SomeClass.nextid += 1
ログイン後にコピー
独自の ID ジェネレーターを実装することで、オブジェクトの存続期間に関係なく、オブジェクトごとに一意の ID を作成できます。

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

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