了解迭代期间修改列表的危险
在修改列表时遍历列表可能会因列表之间的不一致而导致意外行为列表的状态和迭代器对它的理解。为了说明这一点,请考虑以下 Python 代码:
l = range(100) for i in l: print(i) print(l.pop(0)) print(l.pop(0))
此代码产生的不是预期的连续数字输出,而是产生特殊的结果。原因在于,当迭代器迭代列表 l 时,列表本身正在被修改。具体来说,pop(0) 方法从 l.
开头删除元素。为了防止这种不一致,避免修改正在迭代的容器至关重要。一种常见的解决方案是创建容器的副本并迭代该副本。但是,在这种情况下,目标是修改原始容器,则需要采用不同的方法。
考虑以下替代代码:
i = 0 while i < len(some_list): print(some_list[i]) print(some_list.pop(0)) print(some_list.pop(0)) i += 1
在此代码中,我们使用一个 while 循环来手动控制迭代。我们不直接迭代列表,而是使用索引 i 来访问元素,然后手动从 some_list 中弹出项目。这确保循环响应 some_list 的更新。
以上是为什么在 Python 中在迭代期间修改列表会导致意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!