Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:调用';列表';在贴图对象上单击两次_Python_Python 3.x_Lambda - Fatal编程技术网

Python:调用';列表';在贴图对象上单击两次

Python:调用';列表';在贴图对象上单击两次,python,python-3.x,lambda,Python,Python 3.x,Lambda,我想计算n的平方和。假设n是4。然后,此代码生成一个范围为0到4的映射对象列表: m = map(lambda x: x**2, range(0,4)) 放松点。现在调用m上的列表,然后求和: >>> sum(list(m)) 14 意外的行为是,如果我再次运行最后一行,总和为0: >>> sum(list(m)) 0 我怀疑这是因为调用list(m)返回一个空列表,但我找不到对此行为的解释。有人能帮我解决这个问题吗?map在Python 3中返回一个有

我想计算n的平方和。假设n是4。然后,此代码生成一个范围为0到4的映射对象列表:

m = map(lambda x: x**2, range(0,4))
放松点。现在调用m上的列表,然后求和:

>>> sum(list(m))
14
意外的行为是,如果我再次运行最后一行,总和为0:

>>> sum(list(m))
0

我怀疑这是因为调用
list(m)
返回一个空列表,但我找不到对此行为的解释。有人能帮我解决这个问题吗?

map
在Python 3中返回一个有状态迭代器。有状态迭代器只能使用一次,之后它将耗尽,并且不会产生任何值

在代码片段中,您多次使用迭代器<代码>列表(m)每次尝试重新创建列表时,对于第二次和下一次运行,创建的列表将始终为空(因为源迭代器在第一次
列表(m)
操作中被使用)

只需将迭代器转换为列表一次,然后对所述列表进行操作

m = map(lambda x: x**2, range(0,4))
l = list(m)
assert sum(l) == 14
assert sum(l) == 14

map
是一个迭代器,由第一个
列表
调用使用。你为什么不分配
列表(m)
并重用它呢?@jornsharpe是的,我知道这是另一种选择,但我想知道为什么会发生这种情况。你是说list()消耗迭代器?你能告诉我更多(或者在哪里可以找到更多)Python教程/文档吗?谷歌搜索“python迭代器”?不,它不会:…映射对象是迭代器。如果您想避免生成器出现这种行为,可以跳过映射,直接使用列表理解进入列表
m=[x**2代表范围(4)中的x]
我已经修改了你的答案,因为
map()
返回迭代器,而不是生成器-
isinstance(map(lambda x:x**2,范围(0,4)),types.GeneratorType==False
。返回的对象缺少
send()
throw()
,由于
map()
语义,这是合乎逻辑的,因为它不可能与映射到的对象通信。