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!