Rumah > Artikel > pembangunan bahagian belakang > Mengapakah `id({}) == id({})` dan `id([]) == id([])` mengembalikan True dalam CPython?
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!