Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `dict.fromkeys` Python Dengan Nilai Boleh Berubah Menyebabkan Gelagat Tidak Dijangka?

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

Patricia Arquette
Patricia Arquetteasal
2024-10-25 15:56:02248semak imbas

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]}

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: []}

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)

Ini menunjukkan bahawa entri kamus semua merujuk objek yang sama:

>>> xs[0] is a and xs[1] is a
True

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))

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!

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