问题描述
您所看到的是, 解释器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()
它按预期方式工作,但是由于它从迭代器返回下一个值,并由交互式解释器回显,因此您被认为是循环以某种方式拥有自己的迭代器副本。
解决方法
考虑:
>>> 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
在这种情况下似乎不推进迭代器呢?