Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `id({}) == id({})` dan `id([]) == id([])` mengembalikan True dalam CPython?

Mengapakah `id({}) == id({})` dan `id([]) == id([])` mengembalikan True dalam CPython?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-30 04:11:03257semak imbas

Why do `id({}) == id({})` and `id([]) == id([])` return True in CPython?

Pengecam Objek Unik dalam CPython: Mengapa id({}) == id({}) dan id([]) == id([])

Fungsi id() CPython memberikan pengecam unik kepada objek, tetapi keunikan ini terhad kepada jangka hayat objek. Apabila objek dimusnahkan, pengecamnya tersedia untuk digunakan semula.

Pertimbangkan tingkah laku berikut:

<code class="python">tuple1 = ()
tuple2 = ()                                                                                                   
dict1 = {}
dict2 = {}
list1 = []
list2 = []
# makes sense, tuples are immutable
assert(id(tuple1) == id(tuple2))
# also makes sense dicts are mutable
assert(id(dict1) != id(dict2))
# lists are mutable too
assert(id(list1) != id(list2))
assert(id(()) == id(()))
# why no assertion error on this?
assert(id({}) == id({}))
# or this?
assert(id([]) == id([]))</code>

Mengapa id({}) == id({}) dan id([ ]) == id([]) return True?

Peruntukan Memori CPython

Pernyataan ini berjaya kerana mekanisme peruntukan memori CPython. Apabila id({}), CPython memperuntukkan kamus, menghantar alamat memorinya kepada id(), dan kemudian membuang kamus. Apabila ia dipanggil semula, CPython mencari blok memori percuma dan menggunakan semula alamat yang sama. Kebolehubahan tidak menjejaskan tingkah laku ini secara langsung.

Caching Objek Kod

Tuple dan rentetan cache objek kod yang digunakan dalam fungsi, kelas atau modul tertentu. Jika literal yang sama (integer, rentetan atau tupel tertentu) muncul beberapa kali, objek yang sama akan digunakan semula. Objek boleh ubah sentiasa dicipta pada masa jalan, menghalang penggunaan semula.

Kesimpulan

Oleh itu, id objek dalam CPython adalah unik hanya semasa jangka hayatnya. Sebaik sahaja objek dimusnahkan, idnya boleh digunakan semula oleh objek lain. Ini menerangkan tingkah laku yang diperhatikan dalam coretan kod yang disediakan.

Atas ialah kandungan terperinci Mengapakah `id({}) == id({})` dan `id([]) == id([])` mengembalikan True dalam CPython?. 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