考虑:
>>> 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似乎没有推进迭代器呢?
你看到的是除了每次迭代打印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行被写入终端。
如果指定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()正在按预期工作,但是因为它从迭代器返回下一个值,由交互式解释器回显,所以你会相信循环有某种方式具有自己的迭代器副本。
我从口译员那里不知道这种行为。我很高兴我在解决一些真正的问题之前,在失去了很多时间之前就发现了这一点。
...... *死了*。最糟糕的是,我记得很可能在一周前向某人提及这种解释行为。
有趣。我试着在一个:下一个(a);打印我并认为我会跳到1并打印1,3,5,7,9。但它仍然是0,2,4,6,8。为什么?
i已经分配。 next(a)表示下一次迭代2被分配给i,然后再次移动a,打印i等。
如果n为奇数,则不起作用 - 在列表排除后调用next(a)时会引发StopIteration异常。
这是一个很好的解释。
发生的事情是next(a)返回a的下一个值,它被打印到控制台,因为它不受影响。
您可以做的是使用此值影响变量:
>>> a = iter(list(range(10)))
>>> for i in a:
... print(i)
... b=next(a)
...
0
2
4
6
8
我发现现有的答案有点令人困惑,因为它们只间接地表明代码示例中必不可少的神秘事物:"print i"和"next(a)"都会导致打印结果。
由于它们打印原始序列的交替元素,并且出乎意料的是"next(a)"语句正在打印,所以看起来好像"print i"语句正在打印所有值。
在这种情况下,更清楚的是,将"next(a)"的结果分配给变量会禁止打印其"结果",从而只打印"i"循环变量的替代值。同样,使"print"语句发出更具特色的东西也可以消除它的歧义。
(其中一个现有的答案反驳了其他答案,因为答案是将示例代码评估为一个块,以便解释器不报告"next(a)"的中间值。)
一般来说,回答问题时的迷人之处在于,一旦你知道了答案,就会明确一些明显的问题。这可能是难以捉摸的。一旦理解了答案,同样批评答案。这真有趣...
对于那些仍然不理解的人。
>>> 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。将其返回值分配给变量不会神奇地改变其行为。
您的Python /计算机出了问题。
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
>>>
0
2
4
6
8
像预期一样工作。
在Python 2.7和Python 3+中测试过。两者都适用
我得到与@lvc相同的结果(仅在IDLE上,但是当作为脚本执行时我得到了这个))
@Inbar Rose仅当您以脚本身份运行时。
它是通过交互式shell放置代码的行为。如果函数返回值而未使用,则解释器会将其作为调试输出打印到shell
如果作为函数调用它,它的行为方式如下:
>>> def test():
... a = iter(list(range(10)))
... for i in a:
... print(i)
... next(a)
...
>>> test()
0
2
4
6
8