Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `fromkeys` dengan Objek Boleh Berubah Mencipta Nilai Dikongsi dalam Kamus Python?

Mengapakah `fromkeys` dengan Objek Boleh Berubah Mencipta Nilai Dikongsi dalam Kamus Python?

Patricia Arquette
Patricia Arquetteasal
2024-10-26 11:05:29258semak imbas

 Why Does `fromkeys` with Mutable Objects Create Shared Values in Python Dictionaries?

Penciptaan Kamus dengan fromkeys dan Mutable Objects: A Surprising Twist

Kaedah fromkeys dalam Python ialah cara mudah untuk mencipta kamus daripada jujukan kunci, semuanya dipetakan kepada nilai yang ditentukan. Walau bagaimanapun, apabila menggunakan objek boleh ubah sebagai nilai, tingkah laku yang tidak dijangka boleh berlaku.

Keingintahuan

Pertimbangkan contoh berikut dalam Python 2.6 dan 3.2:

<code class="python">xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)</code>

Apa yang mengejutkan kami, mengubah suai senarai yang dikaitkan dengan kunci pertama ([0]) turut mempengaruhi senarai yang dikaitkan dengan kunci kedua ([1]). Ini boleh membingungkan kerana kami menjangkakan setiap kunci mempunyai nilai bebasnya sendiri.

Wahyu

Sebab kelakuan aneh ini terletak pada fakta bahawa kaedah fromkeys mencipta kamus baharu dengan rujukan kepada objek boleh ubah yang sama, dan bukannya membuat salinan berasingan. Dalam erti kata lain, semua entri kamus menghala kepada objek boleh ubah asas yang sama.

Penyelesaian

Untuk mengelakkan isu ini, kita boleh menggunakan pemahaman dict, yang mencipta yang baharu senarai untuk setiap kunci kamus:

<code class="python">xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)</code>

Dalam Python 2.6 dan lebih lama, kita boleh mencapai tingkah laku yang sama dengan menggunakan dict() dengan ungkapan penjana:

<code class="python">xs = dict((i, []) for i in range(2))</code>

Kaedah alternatif ini juga mencipta senarai berasingan untuk setiap kunci kamus.

Kesimpulan

Memahami nuansa penciptaan kamus dengan objek boleh ubah adalah penting untuk mengelakkan tingkah laku yang tidak dijangka dan mengekalkan integriti data dalam kod Python. Dengan memilih kaedah yang sesuai, kami dapat memastikan bahawa entri kamus diasingkan dengan betul dan mengelakkan kesan sampingan yang tidak diingini.

Atas ialah kandungan terperinci Mengapakah `fromkeys` dengan Objek Boleh Berubah Mencipta Nilai Dikongsi dalam Kamus 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