Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `dict.fromkeys()` mencipta objek boleh ubah kongsi dalam Python?

Mengapakah `dict.fromkeys()` mencipta objek boleh ubah kongsi dalam Python?

Patricia Arquette
Patricia Arquetteasal
2024-10-25 16:27:02148semak imbas

 Why does `dict.fromkeys()` create shared mutable objects in Python?

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!

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