为什么默认情况下列表不是迭代器

问题描述 投票:-1回答:1

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]

然后我的问题是,为什么列表默认不是迭代器?

python iterator language-design
1个回答
4
投票

迭代器的状态:

>>> 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
© www.soinside.com 2019 - 2024. All rights reserved.