我不明白为什么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>
>>>
答案 0 :(得分:1)
&#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元素时,都可以使用它。