在迭代期間修改列表時出現意外結果
在迭代列表時修改列表時,可能會出現意外結果。考慮以下程式碼:
numbers = list(range(1, 50)) for i in numbers: if i < 20: numbers.remove(i) print(numbers)
儘管打算從清單中刪除小於 20 的數字,但結果輸出包含其中一些數字。出現這種差異的原因是列表在迭代過程中發生了變更。
具體來說,在刪除第一個低於20 (1) 的數字後,循環繼續到原始列表中的下一項,現在是3 而不是2此過程繼續進行,從而刪除所有低於20 的奇數。
為了避免此問題,建議使用替代方法,例如 list推導式或產生器表達式。以下是使用列表理解的範例:
numbers = [n for n in numbers if n >= 20]
此程式碼保留列表的原始順序,同時過濾掉不需要的元素。或者,您可以使用生成器表達式進行就地更改:
numbers[:] = (n for n in numbers if n >= 20)
如果需要在刪除某個元素之前對其執行操作,請考慮使用索引循環並將該元素設為 None。然後,建立一個僅包含非 None 元素的新清單:
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]
以上是為什麼在迭代期間修改列表會產生意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!