在地图对象上调用“list”两次[重复]

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

我想计算n以内的平方和。假设 n 是 4。然后这段代码会生成一个 0 到 4 范围内的地图对象列表:

m = map(lambda x: x**2, range(0,4))

足够轻松。现在调用 m 上的 list,然后求和:

>>> sum(list(m))
14

意想不到的行为是,如果我再次运行最后一行,总和为 0:

>>> sum(list(m))
0

我怀疑这是因为调用

list(m)
返回一个空列表,但我找不到这种行为的解释。有人可以帮我解决这个问题吗?

python python-3.x lambda
1个回答
38
投票

map
在 Python 3 中返回一个有状态迭代器。有状态迭代器可能只被消耗一次,之后它就会耗尽并且不会产生任何值。

在您的代码片段中,您多次使用迭代器。

list(m)
每次尝试重新创建列表,并且对于第二次和下一次运行,创建的列表将始终为空(因为源迭代器在第一个
list(m)
操作中被消耗)。

只需将迭代器转换为列表一次,然后对所述列表进行操作即可。

m = map(lambda x: x**2, range(0,4))
l = list(m)
assert sum(l) == 14
assert sum(l) == 14
© www.soinside.com 2019 - 2024. All rights reserved.