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

Patricia Arquette
Lepaskan: 2024-10-25 16:27:02
asal
158 orang telah melayarinya

 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!