我是一位阅读旧Python书籍的Python新手。它基于Python 2,所以有时我对细节感到困惑。
有代码
L=map(lambda x:2**x, range(7))
所以它没有在python 3中返回列表,我用Google搜索并发现list(L
)有效。
但问题是,首先list(L)
工作正常,
但是当我再次使用它时,
list(L)
list(L)
第二个返回[ ]
有人能解释我发生了什么吗?
答案 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。希望这有帮助