Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Senarai Bersarang dalam Python Berkongsi Data Dasar yang Sama?

Mengapa Senarai Bersarang dalam Python Berkongsi Data Dasar yang Sama?

DDD
DDDasal
2024-10-31 07:46:02227semak imbas

Why Do Nested Lists in Python Share the Same Underlying Data?

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!

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