在Python 3和Python 2中映射

时间:2018-06-03 22:03:37

标签: python python-3.x python-2.x

我是一位阅读旧Python书籍的Python新手。它基于Python 2,所以有时我对细节感到困惑。

有代码

L=map(lambda x:2**x, range(7))

所以它没有在python 3中返回列表,我用Google搜索并发现list(L)有效。 但问题是,首先list(L)工作正常, 但是当我再次使用它时,

list(L)

list(L)

第二个返回[ ]

有人能解释我发生了什么吗?

2 个答案:

答案 0 :(得分:2)

map返回一个迭代器。因此,其输出可能只使用一次。如果您希望将结果存储在列表中,与Python 2.x一样,只需在使用list时调用map

L = list(map(lambda x:2**x, range(7)))

列表L现在会包含您的结果,但很多时候都会调用它。

您面临的问题是,一旦map迭代一次,它将不会为每个后续调用产生任何内容。因此,您会看到第二个呼叫的空列表。

如果您无法耗尽迭代器但希望两次使用它,请获取有关变通方法的更详细说明和建议,请参阅Why can't I iterate twice over the same data

答案 1 :(得分:0)

Python 3.x返回一个生成器对象:

$ python3 -c "print(map(lambda x: 2**x, range(7)))" 
<map object at 0x104203208>

您可以使用list()提取这些值,但可以耗尽生成器。因此,list()的后续使用将导致空[],因为没有更多值可以通过next()调用进行访问。我建议稍微尝试一下发电机,或者在这里阅读https://wiki.python.org/moin/Generators。希望这有帮助