我没想到这会起作用,因为我正在修改被迭代的对象,但我没想到它会以这种方式失败。我真的以为会有例外。你知道吗
>>> x = [1, 2, 3]
>>> for a in x:
... print a, x.pop(0)
...
1 1
3 2
>>> x
[3]
范围稍大:
>>> x = [1, 2, 3, 4]
>>> for a in x:
... print a, x.pop(0)
...
1 1
3 2
>>> x
[3, 4]
再大一点:
>>> x = [1, 2, 3, 4, 5]
>>> for a in x:
... print a, x.pop(0)
...
1 1
3 2
5 3
>>> x
[4, 5]
这就像for循环从列表中创建一个生成器,但是比较“索引”和列表的长度来决定迭代何时结束。你知道吗
这似乎仍然应该产生一个异常,而不是这种奇怪的行为。有什么原因它不会引发异常吗?
正如您直觉所知,
for
循环在内部使用索引,每次迭代时将其递增1,当索引超过列表长度时停止。这就是如何为列表定义迭代。它是以其他方式为其他类型定义的,您可以通过实现__iter__
为自己的类定义它。你知道吗在遍历列表的同时修改列表是合法的,并且一旦您了解了它的工作原理,就可以预见。删除一个或多个项时,该项之后的项将下移到较低的索引,如果删除的项的索引小于或等于循环的当前索引,则在循环增加索引时将跳过项。你知道吗
有许多解决方案:按相反顺序迭代,对副本进行迭代,列出要删除的索引并分别执行此操作,构建新列表而不是修改现有列表,如果要有条件地删除项,请使用
while
循环而不是if
语句。。。可能还有其他方法。你知道吗相关问题 更多 >
编程相关推荐