首页 > 后端开发 > Python教程 > 为什么在迭代过程中从 Python 列表中删除元素会产生意外结果?

为什么在迭代过程中从 Python 列表中删除元素会产生意外结果?

Patricia Arquette
发布: 2024-12-04 18:11:12
原创
992 人浏览过

Why Does Removing Elements from a Python List During Iteration Produce Unexpected Results?

迭代列表时从列表中删除

迭代列表并删除元素时,Python 的行为可能会令人费解。下面的代码片段:

a = list(range(10))
remove = False
for b in a:
    if remove:
        a.remove(b)
    remove = not remove
print(a)
登录后复制

输出 [0, 2, 3, 5, 6, 8, 9],而不是预期的 [0, 2, 4, 6, 8]。

了解迭代删除行为

此输出来自 Python 在迭代过程中处理可变序列的方式的结果。当调用remove时,底层列表被修改。然而,迭代器保持不变,并继续遍历修改后的列表。

下图说明了删除过程:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]       <-  b = 0; remove? no
 ^
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]       <-  b = 1; remove? yes
    ^
[0, 2, 3, 4, 5, 6, 7, 8, 9]          <-  b = 3; remove? no
       ^
[0, 2, 3, 4, 5, 6, 7, 8, 9]          <-  b = 4; remove? yes
          ^
[0, 2, 3, 5, 6, 7, 8, 9]             <-  b = 6; remove? no
             ^
[0, 2, 3, 5, 6, 7, 8, 9]             <-  b = 7; remove? yes
                ^
[0, 2, 3, 5, 6, 8, 9]                <-  b = 9; remove? no
                   ^
登录后复制

解决剩余问题

  1. 错误指示:Python 不会抛出错误因为它会产生运行时开销。它假设程序员知道在迭代期间修改列表的后果并进行相应的处理。
  2. 历史行为:这种行为从早期版本(至少 1.4)开始就存在于 Python 中,并且与可变序列的典型实现方式一致。

以上是为什么在迭代过程中从 Python 列表中删除元素会产生意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板