了解 Python 迭代期间的列表删除
迭代列表时,可能需要删除元素。但是,如果删除处理不当,这样做可能会导致意外行为。
考虑 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 在迭代时处理可变对象的方式。
问题的可视化解释
操作顺序可以可视化如下:
[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 ^
没有错误指示
当底层迭代器被修改时,Python 不会发出错误,因为确定突变何时以及如何影响迭代器需要大量的运行时分析,从而显着减慢执行速度。
行为一致性
此示例中描述的行为在不同版本的 Python 中保持一致,确保可预测执行在迭代期间修改可变对象的代码。
以上是为什么在迭代期间从 Python 列表中删除元素会导致意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!