Penciptaan Kamus dan Objek Boleh Berubah: Gelagat Mengejutkan dengan fromkeys
Apabila mencipta kamus menggunakan dict.fromkeys() dalam Python, situasi yang tidak dijangka mungkin timbul apabila objek boleh ubah digunakan sebagai nilai. Pertimbangkan contoh berikut:
<code class="python">xs = dict.fromkeys(range(2), []) xs[0].append(1) print(xs)</code>
Walaupun mencipta dua objek senarai berasingan sebagai nilai untuk kekunci kamus 0 dan 1, menambahkan elemen pada senarai pada indeks 0 juga menambahkannya pada senarai pada indeks 1. Ini berlaku kerana fromkeys mengikat setiap kunci kepada rujukan yang sama bagi objek boleh ubah, mengakibatkan pengubahsuaian dikongsi.
Sebaliknya, pemahaman kamus dalam Python 3.2 mempamerkan tingkah laku yang berbeza:
<code class="python">xs = {i: [] for i in range(2)} xs[0].append(1) print(xs)</code>
Di sini, setiap satu kunci terikat pada objek senarai yang berbeza. Menambahkan elemen pada senarai di indeks 0 tidak menjejaskan senarai di indeks 1.
Mengapa Perbezaan?
Tingkah laku fromkeys boleh difahami dengan mempertimbangkan kod setara berikut:
<code class="python">a = [] xs = dict.fromkeys(range(2), a)</code>
Setiap kunci dalam kamus yang terhasil merujuk objek yang sama, yang membawa kepada pengubahsuaian dikongsi yang diperhatikan.
Untuk mencapai gelagat yang diingini bagi objek boleh ubah yang berbeza bagi setiap kunci , gunakan pemahaman kamus atau, untuk Python 2.6 dan lebih awal tanpa pemahaman kamus, gunakan dict() dengan ungkapan penjana:
<code class="python">xs = dict((i, []) for i in range(2))</code>
Atas ialah kandungan terperinci Mengapakah `dict.fromkeys()` mencipta objek boleh ubah kongsi dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!