Python 列表迭代器行为和 next(iterator)

问题描述

您看到的是 解释器next()除了在i每次迭代中打印之外还回显返回值:

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    next(a)
... 
0
1
2
3
4
5
6
7
8
9

0输出print(i)1来自 的返回值、交互式解释器的回显等也是如此next()。只有 5 次迭代,每次迭代导致 2 行被写入终端。

如果您分配next()事物的输出按预期工作:

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    _ = next(a)
... 
0
2
4
6
8

或打印 额外 信息以区分print()交互式解释器回显的输出

>>> a = iter(list(range(10)))
>>> for i in a:
...    print('Printing: {}'.format(i))
...    next(a)
... 
Printing: 0
1
Printing: 2
3
Printing: 4
5
Printing: 6
7
Printing: 8
9

换句话说,next()它按预期工作,但是因为它从迭代器返回下一个值,由交互式解释器回显,你被引导相信循环以某种方式有自己的迭代器副本。

解决方法

考虑:

>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2

因此,正如预期的那样,推进迭代器是通过改变同一个对象来处理的。

在这种情况下,我希望:

a = iter(list(range(10)))
for i in a:
   print(i)
   next(a)

跳过每个第二个元素:调用next应该推进迭代器一次,然后循环进行的隐式调用应该推进它第二次——第二次调用的结果将被分配给i.

它没有。循环打印列表中的 所有 项目,而不跳过任何项目。

我的第一个想法是这可能会发生,因为循环调用iter了它传递的内容,这可能会给出一个独立的迭代器——情况并非如此,因为我们有iter(a) is a.

那么,为什么next在这种情况下似乎没有推进迭代器呢?