如何安全地迭代和删除 Python 列表中的项目?

Susan Sarandon
发布: 2024-10-19 11:52:29
原创
583 人浏览过

How to Safely Iterate and Remove Items from a Python List?

了解在迭代期间从列表中删除项目的危险

尝试在迭代列表时从列表中删除所有元素,用户可能会遇到意外的行为。让我们看一下说明这个问题的代码片段:

<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 的列表理解的行为有所不同。正如文档所阐明的,“修改循环中迭代的序列是不安全的。”通过在迭代列表时从列表中删除一个元素,下一个元素的索引将变得不正确。因此,循环会跳过一个元素,从而导致观察到的模式。

安全替代方案

要安全地从列表中删除所有元素,有多种选择:

  1. 使用 del: 此方法会删除所有元素并留下一个空列表:

    <code class="python">del letters[:]</code>
    登录后复制
  2. 使用字母[:] = []: 这将创建一个新的空列表,并丢弃旧的列表:

    <code class="python">letters[:] = []</code>
    登录后复制
  3. 分配一个新列表: 这将创建单独的对象:

    <code class="python">letters = []</code>
    登录后复制
  4. 过滤列表: 有选择地删除元素时,建议迭代列表的副本:

    <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中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!