在迭代期间修改列表
在循环遍历列表时修改列表时,提供的代码片段会出现意外行为:
l = range(100) for i in l: print i, print l.pop(0), print l.pop(0)
这段代码的输出与人们可能期望的不同,因为修改列表的行为(通过弹出elements) 影响迭代器。当为列表创建迭代器时,它会跟踪列表中的当前位置。当元素从列表中删除时,迭代器的位置也会相应调整。但是,如果在迭代过程中修改列表,则迭代器的位置将变得无效,并且可能会发生不可预测的结果。
在这种特定情况下,循环旨在循环遍历列表 l 中的元素。但是,当从列表中弹出一个元素时,迭代器的位置会发生移动,导致它跳过列表中的下一个元素。因此,循环仅迭代原始列表元素的一半。
为了避免这种行为,重要的是永远不要修改正在迭代的容器。相反,人们应该创建容器的副本并对其进行迭代。这可以通过在开始循环之前复制列表来实现:
l_copy = l[:] for i in l_copy: print i, print l.pop(0), print l.pop(0)
或者,可以使用 while 循环而不是 for 循环,它为列表中的当前位置维护一个单独的索引:
i = 0 while i < len(l): print i, print l.pop(0), print l.pop(0) i += 1
以上是为什么在迭代期间修改列表会导致意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!