考虑:
>>> 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
.
事实并非如此。循环打印all列表中的项目,不跳过任何项目。
我的第一个想法是这可能会发生,因为循环调用iter
根据它传递的内容,这可能会给出一个独立的迭代器 - 事实并非如此,正如我们所见iter(a) is a
.
那么,为什么next
在这种情况下似乎不会推进迭代器?
你看到的是口译员回显返回值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
So 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
或打印extra信息来区分print()
交互式解释器 echo 的输出:
>>> 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()
正在按预期工作,但因为它从迭代器返回下一个值,并由交互式解释器回显,所以您会认为循环以某种方式拥有自己的迭代器副本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)