Indeks Senarai Bersarang
Dalam Python, senarai bersarang boleh dibuat menggunakan senarai senarai. Walau bagaimanapun, apabila mengubah suai nilai dalam senarai ini, perangkap biasa timbul disebabkan pengendalian rujukan Python.
Pertimbangkan 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>
Output yang dimaksudkan ialah:
[0, 0, 0, 0] [0, 1, 1, 1] [0, 1, 1, 1] [0, 1, 1, 1]
Walau bagaimanapun, output sebenar ialah:
[0, 1, 1, 1] [0, 1, 1, 1] [0, 1, 1, 1] [0, 1, 1, 1]
Memahami Isu
Isu ini berpunca daripada baris some_list = 4 * [(4 * [0 ])]. Di sini, ungkapan [(4 * [0])] mencipta senarai tunggal dengan empat elemen, setiap satu senarai dengan empat sifar. Walau bagaimanapun, pendaraban 4 * seterusnya mencipta empat rujukan kepada senarai yang sama, bukannya empat senarai yang berbeza.
Akibatnya, apabila nilai diubah suai dalam satu elemen some_list, ia turut mempengaruhi elemen lain kerana ia semua menunjuk ke senarai asas yang sama. Tingkah laku ini dikenali sebagai hantaran rujukan dalam Python.
Penyelesaian
Untuk menyelesaikan isu ini dan mencipta senarai bebas dalam some_list, gelung boleh digunakan untuk mencipta setiap subsenarai secara individu , seperti berikut:
<code class="python">some_list = [(4 * [0]) for _ in range(4)]</code>
Kod ini mencipta empat senarai berbeza, setiap satu dengan empat sifar. Mengubah suai nilai dalam satu subsenarai tidak lagi akan menjejaskan subsenarai yang lain.
Atas ialah kandungan terperinci Mengapa Senarai Bersarang dalam Python Berkongsi Data Dasar yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!