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

Mengapa Mengubah Suai Senarai Semasa Lelaran Membawa kepada Keputusan Yang Tidak Dijangka?

Patricia Arquette
Lepaskan: 2025-01-05 15:52:40
asal
461 orang telah melayarinya

Why Does Modifying a List During Iteration Lead to Unexpected Results?

Mengubah suai Senarai semasa Lelaran

Coretan kod yang disediakan mempamerkan gelagat yang tidak dijangka apabila mengubah suai senarai semasa menggelungkannya:

l  = range(100)                         
for i in l:                         
    print i,                         
    print l.pop(0),                  
    print l.pop(0)
Salin selepas log masuk

Keluaran kod ini berbeza daripada apa yang dijangkakan kerana tindakan mengubah suai senarai (dengan muncul elemen) mempengaruhi iterator. Apabila iterator dicipta untuk senarai, ia menjejaki kedudukan semasa dalam senarai. Apabila elemen dialih keluar daripada senarai, kedudukan iterator dilaraskan dengan sewajarnya. Walau bagaimanapun, jika senarai diubah suai semasa lelaran sedang berjalan, kedudukan lelaran menjadi tidak sah dan keputusan yang tidak dapat diramalkan boleh berlaku.

Dalam kes khusus ini, gelung bertujuan untuk menggelungkan elemen dalam senarai l . Walau bagaimanapun, apabila elemen muncul daripada senarai, kedudukan iterator dialihkan, menyebabkan ia melangkau elemen seterusnya dalam senarai. Akibatnya, gelung melelaran hanya separuh daripada elemen senarai asal.

Untuk mengelakkan gelagat ini, adalah penting untuk tidak mengubah suai bekas yang sedang diulang. Sebaliknya, seseorang harus membuat salinan bekas dan mengulanginya. Ini boleh dicapai dengan menyalin senarai sebelum memulakan gelung:

l_copy = l[:]
for i in l_copy:
    print i,                         
    print l.pop(0),                  
    print l.pop(0)
Salin selepas log masuk

Sebagai alternatif, seseorang boleh menggunakan gelung sementara dan bukannya gelung for, yang mengekalkan indeks berasingan untuk kedudukan semasa dalam senarai:

i = 0
while i < len(l):
    print i,                         
    print l.pop(0),                  
    print l.pop(0)
    i += 1
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Mengubah Suai Senarai Semasa Lelaran 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