Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Mengubah Suai Senarai Bersarang dalam Python Membawa kepada Keputusan Yang Tidak Dijangka?

Mengapa Mengubah Suai Senarai Bersarang dalam Python Membawa kepada Keputusan Yang Tidak Dijangka?

Patricia Arquette
Lepaskan: 2024-10-30 04:12:02
asal
628 orang telah melayarinya

Why Does Modifying a Nested List in Python Lead to Unexpected Results?

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

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

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!

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