Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah dua objek berbeza dalam CPython boleh mempunyai ID yang sama walaupun ia bukan objek yang sama?

Mengapakah dua objek berbeza dalam CPython boleh mempunyai ID yang sama walaupun ia bukan objek yang sama?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-31 00:33:03775semak imbas

Why can two distinct objects in CPython have the same ID even though they are not the same object?

Memahami ID Objek Serupa dalam CPython

Dalam CPython, id() fungsi terbina dalam mengembalikan integer unik yang mewakili alamat memori objek . Menariknya, dalam keadaan tertentu, dua objek berbeza boleh mempunyai ID yang sama, seperti yang diperhatikan dalam contoh berikut:

<code class="python">tuple1 = ()
tuple2 = ()
dict1 = {}
dict2 = {}
list1 = []
list2 = []

# Tuples are immutable
assert(id(tuple1) == id(tuple2))

# Dicts are mutable
assert(id(dict1) != id(dict2))

# Lists are mutable too
assert(id(list1) != id(list2))

# Unexpectedly, empty dicts and lists have the same ID
assert(id({}) == id({}))
assert(id([]) == id([]))</code>

Sebab Di Sebalik Tingkah Laku

Pelik ini fenomena berlaku disebabkan oleh tingkah laku masa jalan pengalokasi memori CPython dan cara ia mengendalikan penciptaan dan pemusnahan objek. Apabila id({}) dipanggil, CPython mencipta objek kamus baharu dan menetapkannya ke lokasi sementara dalam ingatan. Walau bagaimanapun, objek sementara ini dimusnahkan serta-merta selepas IDnya dikembalikan oleh fungsi id(). Apabila id({}) seterusnya dipanggil, kamus baharu mungkin berlaku di lokasi memori yang sama seperti yang sebelumnya, menghasilkan ID yang sama walaupun objek ini berbeza.

Alasan ini adalah disokong lagi oleh tingkah laku yang diperhatikan dalam urutan berikut:

<code class="python">id([])
4330909912

x = []
id(x)
4330909912

id([])
4334243440</code>

Kesan Kebolehubahan dan Cache

Perlu diperhatikan bahawa kebolehubahan memainkan peranan tidak langsung dalam tingkah laku ini. Walaupun objek boleh ubah (seperti senarai dan kamus) tidak layak untuk caching objek kod, objek tidak boleh ubah (seperti tupel kosong dan rentetan tertentu). Ini bermakna dalam objek kod yang sama, objek tidak berubah ini akan digunakan semula, yang berpotensi membawa kepada penugasan ID yang sama kepada objek tidak berubah yang berbeza.

Keunikan Id dan Sepanjang Hayat Objek

Ringkasnya, ID objek adalah unik hanya untuk tempoh hayatnya. Sebaik sahaja objek dimusnahkan atau sebelum ia dicipta, objek lain mungkin diberikan ID yang sama. Tingkah laku ini menekankan sifat sementara ID objek dalam CPython dan kepentingan memahami peruntukan memori dan dinamik penciptaan objek dalam konteks pelaksanaan Python yang mendasari.

Atas ialah kandungan terperinci Mengapakah dua objek berbeza dalam CPython boleh mempunyai ID yang sama walaupun ia bukan objek yang sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn