【发布时间】:2020-03-27 01:17:46
【问题描述】:
以下是我使用 Python 3.8.1(在 macOS Mojave 上,10.14.6 上,如
以及其他一些平台上的 Python 3.7(或更早版本))。我是新来的
计算,不知道如何要求改进
语言,但我想我发现了内置的奇怪行为
函数map。
由于代码 next(iter(())) 引发 StopIteration,我希望
从以下代码中获取StopIteration:
tuple(map(next, [iter(())]))
令我惊讶的是,这会默默地返回元组 ()!
所以看起来地图对象的解包在什么时候停止了
StopIteration 来自 next 击中“空”迭代器
由iter(()) 返回。但是,我不认为例外是
处理得当,因为 StopIteration 在“空”之前没有提出
从列表中选择迭代器(被next 命中)。
- 我是否正确理解了该行为?
- 这种行为是否有意为之?
- 这会在不久的将来改变吗?或者我怎样才能得到它?
编辑:如果我以不同的方式解包地图对象,例如list、for-loop、在列表中解包、函数参数解包、set、dict,则行为相似。所以我认为不是tuple 而是map 这是错误的。
编辑:实际上,在 Python 2 (2.7.10) 中,“相同”的代码会引发
StopIteration。我认为这是理想的结果(除了 map 在这种情况下不返回迭代器)。
【问题讨论】:
-
这种行为看起来是正确的,因为
map(next, [iter(())])返回一个(空)地图对象 -
map没有捕捉到 StopIteration 异常。它让它传播,看起来就像地图的尽头。 -
@chepner
map没有捕捉到StopIteration。它冒泡然后 tuple(...) 认为它是可迭代的结束。 -
@JoshAbraham:你能解释一下为什么应该返回一个(空)地图对象而不会出错吗?
-
Josh 错了,或者至少没有清楚地沟通。
map(next, [iter(())])返回看起来像普通空地图的东西,因为StopIteration从next传播出来,但它不是普通的空地图。
标签: python python-3.x behavior built-in map-function