Mengapakah `dict.fromkeys` Python Dengan Nilai Boleh Berubah Menyebabkan Gelagat Tidak Dijangka?

Patricia Arquette
Lepaskan: 2024-10-25 15:56:02
asal
246 orang telah melayarinya

Why Does Python's `dict.fromkeys` With Mutable Values Cause Unexpected Behavior?

Penciptaan Kamus dengan fromkeys dan Objek Boleh Berubah: Kejutan Yang Tidak Dijangka

Dalam Python 2.6 dan 3.2, gelagat dict.fromkeys dengan objek boleh ubah boleh mengejutkan. Apabila senarai digunakan sebagai nilai, mengubah suai satu entri dalam kamus mempengaruhi setiap entri lain, seperti yang ditunjukkan di bawah:

>>> xs = dict.fromkeys(range(2), [])
>>> xs
{0: [], 1: []}
>>> xs[0].append(1)
>>> xs
{0: [1], 1: [1]}
Salin selepas log masuk

Walau bagaimanapun, tingkah laku ini tidak berlaku dengan pemahaman dict Python 3.2:

>>> xs = {i:[] for i in range(2)}
>>> xs
{0: [], 1: []}
>>> xs[0].append(1)
>>> xs
{0: [1], 1: []}
Salin selepas log masuk

Sebab bagi Gelagat fromkeys

Sebab yang jelas bagi tingkah laku fromkeys ialah setiap entri dalam kamus yang terhasil merujuk objek yang sama. Mengubah suai objek melalui satu entri memberi kesan kepada semua yang lain. Ini boleh dijelaskan dengan mencipta kamus secara manual:

>>> a = []
>>> xs = dict.fromkeys(range(2), a)
Salin selepas log masuk

Ini menunjukkan bahawa entri kamus semua merujuk objek yang sama:

>>> xs[0] is a and xs[1] is a
True
Salin selepas log masuk

Mengurangkan Tingkah Laku dengan Pemahaman Dict

Untuk mengelakkan tingkah laku ini, gunakan pemahaman dict atau, jika menggunakan Python 2.6 atau lebih awal, gunakan dict dengan ungkapan penjana:

xs = dict((i, []) for i in range(2))
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah `dict.fromkeys` Python Dengan Nilai Boleh Berubah Menyebabkan Gelagat Tidak Dijangka?. 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!