lvc*_*lvc 133 python iteration iterator list
考虑:
>>> lst = iter([1,2,3])
>>> next(lst)
1
>>> next(lst)
2
Run Code Online (Sandbox Code Playgroud)
因此,正如预期的那样,推进迭代器是通过改变同一个对象来处理的.
在这种情况下,我希望:
a = iter(list(range(10)))
for i in a:
print(i)
next(a)
Run Code Online (Sandbox Code Playgroud)
跳过每个第二个元素:调用next
应该使迭代器前进一次,然后循环的隐式调用应该再次前进 - 并且第二次调用的结果将被分配给i
.
它没有.循环打印列表中的所有项目,而不跳过任何项目.
我的第一个想法是,这可能发生,因为循环调用iter
它传递的内容,这可能会给出一个独立的迭代器 - 事实并非像我们所说的那样iter(a) is a
.
那么,为什么next
在这种情况下似乎没有推进迭代器呢?
Mar*_*ers 185
你看到的是解释器回显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
Run Code Online (Sandbox Code Playgroud)
交互式解释器等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
Run Code Online (Sandbox Code Playgroud)
或打印额外信息以区分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
Run Code Online (Sandbox Code Playgroud)
换句话说,next()
正在按预期工作,但是因为它从迭代器返回下一个值,由交互式解释器回显,所以你会相信循环有某种方式具有自己的迭代器副本.
njz*_*zk2 12
发生的事情是next(a)
返回a的下一个值,该值打印到控制台,因为它不受影响.
您可以做的是使用此值影响变量:
>>> a = iter(list(range(10)))
>>> for i in a:
... print(i)
... b=next(a)
...
0
2
4
6
8
Run Code Online (Sandbox Code Playgroud)
我觉得现有的答案有点混乱,因为他们只间接地表明了代码示例基本神秘的事:既要打印*"打印我"和"未来(一)"是导致他们的结果.
由于它们打印原始序列的交替元素,并且出乎意料的是"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
Run Code Online (Sandbox Code Playgroud)
正如其他人已经说过的,next
按预期将迭代器增加 1。将其返回值分配给变量并不会神奇地改变其行为。