在迭代過程中從列表中刪除項目- 為什麼典型的習慣用法會失敗
在編程中,迭代列表並刪除是常見的做法根據需要的項目。然而,當涉及 Python 時,有一個警告,這個習慣用法可能會導致意外結果。
考慮以下 Python 程式碼:
<code class="python">letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] for i in letters: letters.remove(i) print(letters)</code>
此程式碼嘗試從清單。令人驚訝的是,程式碼的輸出不是空列表,而是包含原始列表中的所有其他項目:
['b', 'd', 'f', 'h', 'j', 'l']
解釋
這樣做的原因行為在於Python 在迭代期間處理列表修改。文件明確指出:
「修改循環中迭代的序列是不安全的[...] 如果您需要修改正在迭代的清單[...] 您必須迭代在副本上。」
在提供的程式碼中,我們嘗試在迭代時修改列表字母。 Python 處理這種情況的設計是,每次刪除後迭代都會跳過所有其他項目。
重寫程式碼
要避免此問題,程式碼必須是重寫以在迭代列表之前建立清單的副本。有幾種方法可以實現此目的:
或者,如果目標是根據條件刪除特定項目,則使用 filter() 函數建立新項目會更有效僅包含所需項目的清單。這種方法避免了對原始清單的副本進行迭代的需要。
以上是為什麼在 Python 中迭代和刪除列表會導致意外結果的詳細內容。更多資訊請關注PHP中文網其他相關文章!