Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Mengubah Suai Senarai Semasa Lelaran Menghasilkan Keputusan Yang Tidak Dijangka?

Mengapa Mengubah Suai Senarai Semasa Lelaran Menghasilkan Keputusan Yang Tidak Dijangka?

Susan Sarandon
Susan Sarandonasal
2024-12-23 19:53:17804semak imbas

Why Does Modifying a List During Iteration Produce Unexpected Results?

Hasil Yang Tidak Dijangka Semasa Mengubah Suai Senarai Semasa Lelaran

Apabila mengubah suai senarai sambil mengulanginya, hasil yang tidak dijangka boleh berlaku. Pertimbangkan kod berikut:

numbers = list(range(1, 50))

for i in numbers:
    if i < 20:
        numbers.remove(i)

print(numbers)

Walaupun ada niat untuk mengalih keluar nombor kurang daripada 20 daripada senarai, output yang terhasil termasuk beberapa nombor ini. Percanggahan ini timbul kerana senarai sedang diubah semasa lelaran.

Khususnya, selepas mengalih keluar nombor pertama di bawah 20 (1), gelung meneruskan ke item seterusnya dalam senarai asal, yang kini 3 bukannya 2 . Proses ini berterusan, menyebabkan semua nombor ganjil di bawah 20 dialih keluar.

Untuk mengelakkan isu ini, disyorkan untuk menggunakan pendekatan alternatif, seperti pemahaman senarai atau ungkapan penjana. Berikut ialah contoh menggunakan pemahaman senarai:

numbers = [n for n in numbers if n >= 20]

Kod ini mengekalkan susunan asal senarai sambil menapis elemen yang tidak diingini. Sebagai alternatif, anda boleh menggunakan pengubahan di tempat dengan ungkapan penjana:

numbers[:] = (n for n in numbers if n >= 20)

Jika anda perlu melakukan operasi pada elemen sebelum mengalih keluarnya, pertimbangkan untuk menggunakan gelung diindeks dan tetapkan elemen kepada Tiada. Kemudian, buat senarai baharu yang mengandungi hanya elemen bukan Tiada:

for i, n in enumerate(numbers):
    if n < 20:
        print("do something")
        numbers[i] = None
numbers = [n for n in numbers if n is not None]

Atas ialah kandungan terperinci Mengapa Mengubah Suai Senarai Semasa Lelaran Menghasilkan Keputusan Yang Tidak Dijangka?. 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