转换为列表

时间:2016-03-09 06:06:55

标签: python list python-3.x lambda

我不明白为什么map对象会自行冲洗(如果它正在做什么)。

这是我尝试过的。

>>> squares = map(lambda x: x**2, range(10))
>>> squares
<map object at 0x7f25a1cae2e8>
>>> square_list = list(squares)
>>> square_list
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> list(squares)
[]

为什么空? 下面再次相同

>>> squares = map(lambda x: x**2, range(10))
>>> squares
<map object at 0x7f25a1cae320>
>>> [x for x in list(squares)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> list(squares)
[]
>>> squares
<map object at 0x7f25a1cae320>
>>> 

3 个答案:

答案 0 :(得分:1)

涵盖herehereherehere

&#34;在Python 3+中,许多迭代迭代的进程返回迭代器本身。在大多数情况下,这最终会节省内存,并且应该让事情变得更快。 &#34; - 用户Triptych

答案 1 :(得分:1)

在Python 3.x中,map不返回列表对象,而是返回迭代器。

  

返回一个迭代器,它将函数应用于每个iterable项,产生结果。

基本上,它不会处理立即传递的iterable的所有元素。无论何时被要求,它都会一次处理一个。

在您的情况下,range对象中的所有元素都是逐个处理的,当处理完所有元素时,map返回的迭代器对象已经用尽(没有剩下的东西了)被处理)。这就是为什么当你第二次list(squares)时你得到空列表。

例如,

>>> squares = map(lambda x: x**2, range(10))
>>> next(squares)
0
>>> next(squares)
1
>>> next(squares)
4
>>> next(squares)
9

在这里,我们刚刚按需处理了前四项。这些值不是在事先计算的,但调用lambda函数时,迭代器中的下一个值传递给正方形(range(10)),当你实际执行next(squares)并且值为返回。

>>> list(squares)
[16, 25, 36, 49, 64, 81]

现在,只处理迭代器中的其余项。如果您尝试获取下一个项目,

>>> next(squares)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
StopIteration

由于squares已用完,StopIteration被引发,这就是为什么list(squares)没有获取要处理的任何元素并返回空列表的原因。

答案 2 :(得分:-1)

@thefourtheye和@jDo已经解释了这一切。 如果你不想要你的&#34;正方形&#34;要刷新的对象,使其成为一个列表:

squares = list(map(lambda x: x**2, range(10)))

所以,现在每次你想使用square元素时,都可以使用它。