Python3 使用 list(map(...)) 时无法引发 StopIteration 错误

Python3 StopIteration Error can not raise when using list(map(...))

起初我写这个,它引发了 StopIteration,效果很好。

it = iter([1])
iters = [it] * 2
for it in iters:
    r = next(it)
    print(r)

但是当我改成这个时:

it = iter([1])
iters = [it] * 2
r = list(map(next, iters))
print(r)

它不能引发 StopIteration,如何解释?

list 构造函数检测到参数是可迭代的,因此它对其进行迭代有点像这样(我正在弥补):

def __init__(self,iterable):
    # some init stuff to create the list
    while True:
       try:
           next_element = next(iterable)
           self.append(next_element)
       except StopIteration:
           break

在某个时刻迭代器引发 StopIteration,所以 list 拦截它并结束列表(对于生成器没有其他方法可以做到这一点,例外是指示迭代已结束)

同于:

list(map(next,iter([])))

这里,异常是从下面的级别传播的。 map 没有提高它,但 next 是。对于捕获 StopIteration 异常的 list 构造函数,引发它的级别没有区别。

是的,你无法从 list 构造函数中让 StopIteration "escape",但你可以通过列表理解来引发:

r = [next(it) for it in iters]

(因为 itersStopIteration 而不是 map,所以你发现 list(map(f,y))[f(x) for x in y])