174

考虑:

>>> 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在这种情况下似乎没有推进迭代器呢?

4

6 回答 6

229

您看到的是解释器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()它按预期工作,但是因为它从迭代器返回下一个值,由交互式解释器回显,你被引导相信循环以某种方式有自己的迭代器副本。

于 2013-05-29T13:21:17.027 回答
17

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

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

>>> a = iter(list(range(10)))
>>> for i in a:
...    print(i)
...    b=next(a)
...
0
2
4
6
8
于 2013-05-29T13:23:23.263 回答
11

我发现现有的答案有点令人困惑,因为它们只是间接地表明了代码示例中基本的神秘事物:* “print i”和“next(a)”都导致它们的结果被打印。

由于它们正在打印原始序列的交替元素,并且“next(a)”语句正在打印是出乎意料的,因此“print i”语句似乎正在打印所有值。

有鉴于此,将“next(a)”的结果分配给变量会禁止打印其结果,因此仅打印“i”循环变量的替代值变得更加清楚。同样,使“打印”语句发出更独特的内容也可以消除歧义。

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

一般来说,回答问题的迷人之处在于,一旦你知道答案,就会清楚地说明什么是显而易见的。它可能难以捉摸。同样,一旦你理解了答案,就会批评它们。这真有趣...

于 2013-05-30T14:32:32.383 回答
4

对于那些仍然不明白的人。

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

正如其他人已经说过的那样,next按预期将迭代器增加 1。将其返回值分配给变量不会神奇地改变其行为。

于 2018-07-10T06:48:58.790 回答
2

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

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

>>> 
0
2
4
6
8

像预期的那样工作。

在 Python 2.7 和 Python 3+ 中测试。在两者中都能正常工作

于 2013-05-29T13:19:40.380 回答
1

如果作为函数调用,它会按照您想要的方式运行:

>>> def test():
...     a = iter(list(range(10)))
...     for i in a:
...         print(i)
...         next(a)
... 
>>> test()
0
2
4
6
8
于 2015-10-03T17:39:02.790 回答