【问题标题】:map in Python 3 vs Python 2 [duplicate]Python 3与Python 2中的映射[重复]
【发布时间】:2018-11-13 05:52:24
【问题描述】:

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

有代码

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

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

list(L)

list(L)

第二个返回[ ]

谁能解释一下发生了什么?

【问题讨论】:

  • 如果您想多次使用L,请将L 设为列表:L=list(map(lambda x:2**x, range(7)))

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


【解决方案1】:

map 返回一个迭代器。因此,它的输出只能使用一次。如果您希望将结果存储在列表中,与 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

【讨论】:

    【解决方案2】:

    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。希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      相关资源
      最近更新 更多