- 此问题在此处已有答案**:
Why can't I iterate twice over the same iterator? How can I "reset" the iterator or reuse the data?(5个答案)
9天前关闭。
以下代码不打印for
循环中的任何内容;它只打印tuple
的结果,这非常不直观,因为我没有显式修改cheapest
Map,但它在调用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
循环打印cheapest
Map中的值,print(tuple(cheapest))
结果为空,如下所示:
实际输出(顺序颠倒):
9.0
11.0
12.34
2.01
()
1条答案
按热度按时间aydmsdu91#
在学习Python时,你需要密切关注各种函数的返回类型,因为很多函数,比如
map
,实际上返回的是一个iterator1。虽然迭代器可能是高效的,因为它只在必要时才进行计算,但它可能会导致数据突然“消失”的混乱。
如果您需要在多个位置使用之前捕获该结果,请将其转换为更永久的形式,例如:
因为它是可迭代的,所以仍然可以在
for
中使用。1在Ruby中,这就像
map { ... }.lazy
在默认情况下被启用。在Rust中,这与Python非常相似,map()
必须在它成为迭代器之外的任何东西之前被collect()
捕获。如果你习惯了JavaScript这样的东西,它只是转储一个数组,这将需要一点重新学习。