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
所以0
是print(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