Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Mengubah Suai Subsenarai dalam Senarai Python Bersarang Mempengaruhi Semua Subsenarai?
Kekeliruan Kebolehubahan Senarai Bersarang dalam Python
Pengenalan:
Dalam Python, isu biasa timbul apabila berurusan dengan senarai bersarang. Perubahan yang dibuat kepada subsenarai secara tidak dijangka menjejaskan semua subsenarai lain dalam senarai luar. Tingkah laku yang tidak dijangka ini berpunca daripada mekanisme asas penciptaan senarai dan kebolehubah.
Isunya:
Pertimbangkan kod berikut:
xs = [[1] * 4] * 3
Ini kod mencipta senarai senarai, di mana setiap subsenarai mengandungi empat 1s. Walau bagaimanapun, mengubah suai salah satu elemen paling dalam, seperti yang ditunjukkan di bawah, memberi kesan kepada semua subsenarai:
xs[0][0] = 5
Daripada menukar hanya elemen pertama subsenarai pertama, semua elemen pertama semua subsenarai diubah suai kepada 5.
Sebab:
Kunci untuk memahami tingkah laku ini terletak pada cara Python mendarab urutan. Apabila menggunakan operator * pada senarai sedia ada [x], ia tidak mencipta senarai baharu. Sebaliknya, ia mencipta berbilang rujukan kepada objek senarai yang sama.
Akibatnya, dalam kod xs = [[1] * 4] * 3, ungkapan [1] * 4 dinilai sekali dan tiga rujukan kepada senarai tunggal itu diberikan kepada senarai luar. Ini bermakna semua subsenarai adalah objek yang sama.
Penyelesaian:
Untuk mencipta subsenarai bebas, anda boleh menggunakan pemahaman senarai:
xs = [[1] * 4 for _ in range(3)]
Dalam kes ini, pemahaman senarai menilai semula ungkapan [1] * 4 untuk setiap lelaran, menghasilkan tiga senarai.
Ketidakbolehubahan Integer:
Adalah penting untuk ambil perhatian bahawa integer dalam Python adalah tidak berubah, bermakna nilainya tidak boleh diubah. Oleh itu, walaupun operator * mencipta berbilang rujukan kepada senarai yang sama, nilai integer dalam senarai itu tetap tidak terjejas.
Atas ialah kandungan terperinci Mengapa Mengubah Suai Subsenarai dalam Senarai Python Bersarang Mempengaruhi Semua Subsenarai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!