python列表是可迭代的,但不是迭代器。例如:
>>> a=[1,2,3]
>>> [i for i in a]
[1, 2, 3]
>>> next(a)
TypeError: 'list' object is not an iterator
但是可以通过执行以下操作使其成为迭代器:
a = iter(a)
>>> next(a)
1
>>> [i for i in a]
[2, 3]
然后我的问题是,为什么列表默认不是迭代器?
迭代器的状态:
>>> lst = [1, 2, 3, 4, 5]
>>> i = iter(lst)
>>> next(i)
1
>>> next(i)
2
>>> next(i)
3
要使列表本身成为迭代器,它必须跟踪当前索引,以便next
可以按顺序返回正确的元素。列表本身会记住您当前在其中的位置是很奇怪的,但是结合Python中的迭代器必须具有__iter__
方法returning itself的事实,它将是一个完全的破坏者: >
for x in lst: for y in lst: print(x, y)
如上所述的嵌套循环将根本无法工作,因为它们都将使用相同的迭代器(即列表本身),因此程序将无法跟踪两个循环的单独索引。与预期的行为相比,该行为是错误的。您可以使用
iter(lst)
模拟它,并使用相同的迭代器编写嵌套循环:输出如下。
1 2
1 3
1 4
1 5