映射 Python 3 vs Python 2

map in Python 3 vs Python 2

我是 Python 新手,正在阅读一本 Python 旧书。它基于 Python 2,所以有时我对细节有点困惑。

有密码

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

所以 return python 3 中的列表不存在,我用谷歌搜索发现 list(L) 有效。 但问题是,首先 list(L) 工作正常, 但是当我再次使用它时,

list(L)

list(L)

第二个 returns [ ]

有人可以向我解释发生了什么吗?

map returns 一个迭代器。因此,它的输出只能使用一次。如果您希望将结果存储在列表中,与 Python 2.x 相同,只需在使用 map:

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

列表 L 现在将包含您的结果,无论您调用多少次。

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

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

Python 3.x returns 生成器对象:

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

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