Python列表迭代器行为和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(a) is a

那么,为什么next在这种情况next不会出现提前迭代器呢?

你看到的是除了i每次迭代打印之外, 解释器都回显next()的返回值:

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

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

如果你指定next()的输出如预期的那样工作:

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

或者打印额外的信息来区分来自交互式解释器echo的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()按预期工作,但是因为它从迭代器返回下一个值,并被交互式解释器回显,所以你会相信循环以某种方式拥有自己的迭代器拷贝。

正在发生的是next(a)返回a的下一个值,它被打印到控制台,因为它不受影响。

你可以做的是用这个值影响一个variables:

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

我发现现有的答案有点令人困惑,因为它们只是间接地指出了代码示例中的基本神秘事物:“印刷我”和“下一个(a)”都导致他们的结果被印刷。

由于它们正在打印原始序列的交替元素,并且意外的是“下一个(a)”语句正在打印,所以看起来好像“打印i”语句正在打印所有的值。

有鉴于此,将“下一个(a)”的结果赋值给一个variables会抑制其结果的打印,从而只显示“i”循环variables的替代值。 同样,使“印刷”声明发出更明确的消除歧义的东西也是如此。

(其中一个现有答案驳斥了其他答案,因为答案是将示例代码评估为块,所以解释器不报告“next(a)”的中间值。)

一般来说,在回答问题的过程中,一个明显的问题就是,一旦你知道答案,就会明确表示什么是显而易见的。 这可能是难以捉摸的。 同样,一旦你了解他们,就批评答案。 这真有趣…

你的Python /计算机出了问题。

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

像预期一样工作。

在Python 2.7和Python 3+中testing。 在两个工作正常

如果作为一个函数被调用,它的行为就像你想要的那样:

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