6

我的map功能有问题。当我想打印创建的列表时,解释器会显示指针:

>>> squares = map(lambda x: x**2, range(10))
>>> print(squares)
<map object at 0x0000000002A086A0>

问题是什么?

4

4 回答 4

7

问题是没有创建列表。map在 Python 3 中返回一种特定类型的迭代器,它不是一个列表(而是一个“映射对象”,如您所见)。你可以试试

print(list(squares))

或者只是首先使用列表推导来获取列表(无论如何,这似乎在这里工作得更好):

squares = [x**2 for x in range(10)]

map用于在 Python 2.x 中返回列表,并且在 Python 3 中所做的更改在文档的节中描述:

  • map()filter()返回迭代器。如果你真的需要一个列表,一个快速的解决方法是 eg list(map(...)),但更好的解决方法通常是使用列表推导(特别是当原始代码使用 时lambda,或者重写代码使其根本不需要列表。map()对于函数的副作用调用特别棘手;正确的转换是使用常规for循环(因为创建列表只是浪费)。
于 2013-08-06T18:18:18.120 回答
2

map返回一个迭代器,即这是可以在需要时循环使用的东西。要获取实际列表,请执行print(list(squares)). 或者

for a in squares:    
    print(a)

起初这看起来很奇怪,但想象一下你有 1mio 号码。如果它会立即创建一个列表,那么您需要为 1mio 元素分配内存,即使您可能一次只想查看一个。使用迭代器,只有在必要时才会将完整的元素列表保存在内存中。

于 2013-08-06T18:19:18.630 回答
1

map()在 Python 2 和 3 之间发生了变化。在 Python 2 中,map会将函数应用于可迭代对象的值并返回一个列表。在 Python 3 中,map返回一个迭代器,该迭代器在您循环时将函数应用于迭代值。

蟒蛇2:

>>> print map(lambda x: x**2, range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

python3 - map 返回一个迭代器对象:

>>> print(map(lambda x: x**2, range(10)))
<map object at 0x7fb4b7c82250>

任何消耗迭代器的东西都可以使用它,比如list

>>> print(list(map(lambda x: x**2, range(10))))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
于 2013-08-06T18:41:02.443 回答
-1

您可以使用解包,如下所示:

>>> [*map(lambda x: x**2, range(10))]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
于 2019-09-27T06:50:32.783 回答