了解在迭代期间从列表中删除项目的危险
尝试在迭代列表时从列表中删除所有元素,用户可能会遇到意外的行为。让我们看一下说明这个问题的代码片段:
<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中文网其他相关文章!