PythonMap在使用元组或迭代后清空[重复]

amrnrhlw  于 2023-01-08  发布在  Python
关注(0)|答案(1)|浏览(140)
    • 此问题在此处已有答案**:

Why can't I iterate twice over the same iterator? How can I "reset" the iterator or reuse the data?(5个答案)
9天前关闭。
以下代码不打印for循环中的任何内容;它只打印tuple的结果,这非常不直观,因为我没有显式修改cheapestMap,但它在调用tuple后表现得好像是空的。
那么,发生什么事了?

store1 = [10.00, 11.00, 12.34, 2.34]
store2 = [9.00, 11.10, 12.34, 2.01]
cheapest = map(min, store1, store2)

print(tuple(cheapest))

for v in cheapest: 
    print(v)

预期产出:

(9.0, 11.0, 12.34, 2.01)
9.0
11.0
12.34
2.01

实际产量:

(9.0, 11.0, 12.34, 2.01)

如果我先运行for循环,则行为相反:for循环打印cheapestMap中的值,print(tuple(cheapest))结果为空,如下所示:
实际输出(顺序颠倒):

9.0
11.0
12.34
2.01
()
aydmsdu9

aydmsdu91#

在学习Python时,你需要密切关注各种函数的返回类型,因为很多函数,比如map,实际上返回的是一个iterator1。
虽然迭代器可能是高效的,因为它只在必要时才进行计算,但它可能会导致数据突然“消失”的混乱。
如果您需要在多个位置使用之前捕获该结果,请将其转换为更永久的形式,例如:

cheapest = list(map(min, store1, store2))

因为它是可迭代的,所以仍然可以在for中使用。
1在Ruby中,这就像map { ... }.lazy在默认情况下被启用。在Rust中,这与Python非常相似,map()必须在它成为迭代器之外的任何东西之前被collect()捕获。如果你习惯了JavaScript这样的东西,它只是转储一个数组,这将需要一点重新学习。

相关问题