在迭代期间修改列表时出现意外结果
在迭代列表时修改列表时,可能会出现意外结果。考虑以下代码:
numbers = list(range(1, 50)) for i in numbers: if i < 20: numbers.remove(i) print(numbers)
尽管打算从列表中删除小于 20 的数字,但结果输出包含其中一些数字。出现这种差异的原因是列表在迭代过程中发生了更改。
具体来说,在删除第一个低于 20 (1) 的数字后,循环继续到原始列表中的下一项,现在是 3 而不是 2此过程继续进行,从而删除所有低于 20 的奇数。
为了避免此问题,建议使用替代方法,例如 list推导式或生成器表达式。下面是使用列表理解的示例:
numbers = [n for n in numbers if n >= 20]
此代码保留列表的原始顺序,同时过滤掉不需要的元素。或者,您可以使用生成器表达式进行就地更改:
numbers[:] = (n for n in numbers if n >= 20)
如果需要在删除某个元素之前对其执行操作,请考虑使用索引循环并将该元素设置为 None。然后,创建一个仅包含非 None 元素的新列表:
for i, n in enumerate(numbers): if n < 20: print("do something") numbers[i] = None numbers = [n for n in numbers if n is not None]
以上是为什么在迭代期间修改列表会产生意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!