意外行為:在迭代期間從列表中刪除元素
嘗試迭代列表並刪除滿足特定條件的特定元素時,如果在迭代過程中修改列表,可能會出現意外行為。考慮以下 Python 程式碼:
numbers = list(range(1, 50)) for i in numbers: if i < 20: numbers.remove(i) print(numbers)
令人驚訝的是,所得的結果是:
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
我們希望刪除 20 以下的數字,但它們仍然保留在結果中。這是因為列表在迭代時被修改。當第一個元素 1 被刪除時,後續元素的位置會移動,並且循環繼續到修改列表中的下一個元素,這不是預期的元素。
解決此問題並準確地迭代列表時,我們可以使用列表理解或就地更改。清單推導允許我們建立一個僅包含滿足指定條件的元素的新清單:
numbers = [n for n in numbers if n >= 20]
或者,可以使用切片賦值執行就地變更:
numbers[:] = (n for n in numbers if n >= 20)
透過這種方式修改列表,不影響迭代,可以達到想要的結果。
以上是為什麼在 Python 迭代過程中刪除列表元素會導致意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!