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)
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)
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
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!