Rumah > Artikel > pembangunan bahagian belakang > Mengapa Mengubah Suai Senarai Bersarang dalam Python Membawa kepada Keputusan Yang Tidak Dijangka?
Indeks Senarai Bersarang Dilawati Semula
Dalam Python, senarai bersarang menawarkan cara yang mudah untuk menyusun data. Walau bagaimanapun, bekerja dengan indeks untuk senarai ini kadangkala boleh membawa kepada hasil yang tidak dijangka. Mari kita terokai isu biasa yang berkaitan dengan indeks senarai bersarang dengan contoh kod khusus:
Pertimbangkan coretan kod berikut:
<code class="python">some_list = 4 * [(4 * [0])] for i in range(3): for j in range(3): some_list[i+1][j+1] = 1 for i in range(4): print(some_list[i])</code>
Objektif yang dimaksudkan adalah untuk mencipta senarai 2D dengan nilai di setiap indeks (tidak termasuk baris pertama dan lajur pertama) ditetapkan kepada 1. Walau bagaimanapun, kod gagal mencapai ini. Sebaliknya, ia menghasilkan senarai di mana semua baris dan lajur diisi dengan 1s.
Penjelasan:
Punca isu ini terletak pada kaedah Python untuk menghantar senarai melalui rujukan. Tidak seperti jenis nilai asas, senarai dihantar sebagai rujukan kepada lokasi memori yang sama. Ini bermakna bahawa sebarang perubahan yang dibuat pada satu pembolehubah senarai akan ditunjukkan dalam semua pembolehubah lain yang merujuk senarai yang sama.
Dalam kod yang diberikan, baris some_list = 4 * [(4 * [0])] mendarab a senarai yang mengandungi satu nilai 0 empat kali. Walau bagaimanapun, ia tidak mencipta empat senarai yang berbeza. Sebaliknya, ia mencipta satu senarai dengan empat rujukan yang menunjuk kepada nilai 0 yang sama.
Akibatnya, apabila kod mengemas kini nilai pada [i 1][j 1] untuk lelaran pertama gelung, ia mengubah suai nilai yang ditunjukkan oleh semua rujukan lain. Ini menerangkan sebab semua elemen berakhir dengan nilai 1.
Penyelesaian:
Untuk menyelesaikan isu ini dan mencipta empat senarai yang berbeza, setiap satu dengan set nilainya sendiri, adalah perlu untuk mengelakkan pendaraban kedua. Satu cara untuk melakukan ini ialah menggunakan gelung untuk memulakan setiap baris senarai secara berasingan:
<code class="python">some_list = [(4 * [0]) for _ in range(4)]</code>
Dengan menggelung ke atas julat(4), kod ini mencipta empat senarai yang berbeza, setiap satu dengan set nilai yang berasingan . Akibatnya, pengubahsuaian seterusnya pada nilai senarai tidak akan menjejaskan baris lain.
Atas ialah kandungan terperinci Mengapa Mengubah Suai Senarai Bersarang dalam Python Membawa kepada Keputusan Yang Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!