Penciptaan Kamus dengan fromkeys dan Mutable Objects: A Surprising Twist
Kaedah fromkeys dalam Python ialah cara mudah untuk mencipta kamus daripada jujukan kunci, semuanya dipetakan kepada nilai yang ditentukan. Walau bagaimanapun, apabila menggunakan objek boleh ubah sebagai nilai, tingkah laku yang tidak dijangka boleh berlaku.
Keingintahuan
Pertimbangkan contoh berikut dalam Python 2.6 dan 3.2:
<code class="python">xs = dict.fromkeys(range(2), []) xs[0].append(1) print(xs)</code>
Apa yang mengejutkan kami, mengubah suai senarai yang dikaitkan dengan kunci pertama ([0]) turut mempengaruhi senarai yang dikaitkan dengan kunci kedua ([1]). Ini boleh membingungkan kerana kami menjangkakan setiap kunci mempunyai nilai bebasnya sendiri.
Wahyu
Sebab kelakuan aneh ini terletak pada fakta bahawa kaedah fromkeys mencipta kamus baharu dengan rujukan kepada objek boleh ubah yang sama, dan bukannya membuat salinan berasingan. Dalam erti kata lain, semua entri kamus menghala kepada objek boleh ubah asas yang sama.
Penyelesaian
Untuk mengelakkan isu ini, kita boleh menggunakan pemahaman dict, yang mencipta yang baharu senarai untuk setiap kunci kamus:
<code class="python">xs = {i: [] for i in range(2)} xs[0].append(1) print(xs)</code>
Dalam Python 2.6 dan lebih lama, kita boleh mencapai tingkah laku yang sama dengan menggunakan dict() dengan ungkapan penjana:
<code class="python">xs = dict((i, []) for i in range(2))</code>
Kaedah alternatif ini juga mencipta senarai berasingan untuk setiap kunci kamus.
Kesimpulan
Memahami nuansa penciptaan kamus dengan objek boleh ubah adalah penting untuk mengelakkan tingkah laku yang tidak dijangka dan mengekalkan integriti data dalam kod Python. Dengan memilih kaedah yang sesuai, kami dapat memastikan bahawa entri kamus diasingkan dengan betul dan mengelakkan kesan sampingan yang tidak diingini.
Atas ialah kandungan terperinci Mengapakah `fromkeys` dengan Objek Boleh Berubah Mencipta Nilai Dikongsi dalam Kamus Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!