了解在迭代期間從列表中刪除項目的危險
嘗試在迭代列表時從列表中刪除所有元素,用戶可能會遇到意外的行為。讓我們來看看說明這個問題的程式碼片段:
<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 的列表理解的行為有所不同。正如文件所闡明的,「修改循環中迭代的序列是不安全的。」透過在迭代列表時從列表中刪除一個元素,下一個元素的索引將變得不正確。因此,循環會跳過一個元素,從而導致觀察到的模式。
安全替代方案
要安全地從清單中刪除所有元素,有多種選擇:
使用del: 此方法會刪除所有元素並留下一個空白列表:
<code class="python">del letters[:]</code>
使用字母[:] = []:這將建立一個新的空列表,並丟棄舊的列表:
<code class="python">letters[:] = []</code>
分配一個新列表: 這將建立單獨的物件:
<code class="python">letters = []</code>
過濾列表: 選擇性地刪除元素時,建議迭代列表的副本:
<code class="python">commands = ["ls", "cd", "rm -rf /"] for cmd in commands[:]: if "rm " in cmd: commands.remove(cmd)</code>
或者,可以更簡潔地過濾清單:
<code class="python">commands = [cmd for cmd in commands if not is_malicious(cmd)]</code>
以上是如何安全地迭代和刪除 Python 清單中的項目?的詳細內容。更多資訊請關注PHP中文網其他相關文章!