当我在python 2.6中执行此代码时
reduce(lambda x,y: x+[y], [1,2,3],[])
按预期得到[1,2,3]。 但是当我执行这个时(我认为它等同于之前的)
reduce(lambda x,y: x.append(y), [1,2,3],[])
我收到错误消息
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'append'
为什么这两行代码没有给出相同的结果?
答案 0 :(得分:15)
x.append(y)
不等同于x+[y]
; append
修改了一个列表而没有返回任何内容,而x+[y]
是一个返回结果的表达式。
答案 1 :(得分:7)
reduce
调用该函数并使用返回值作为新结果。 append
返回None
,因此下一个append
调用失败。你可以写
def tmpf(x,y):
x.append(y)
return x
reduce(tmpf, [1,2,3], [])
并获得正确的结果。但是,如果结果是与输入大小相同的列表,则不需要降低:reduce的结果通常应该是单个值。相反,请使用map或简单地
[x for x in [1,2,3]]
答案 2 :(得分:6)
reduce
的函数参数应该返回操作的结果。
x+[y]
会这样做,而x.append(y)
却没有(后者修改x
并返回None
)。
答案 3 :(得分:0)
只是解释错误信息:
AttributeError: 'NoneType' object has no attribute 'append'
表达式
reduce(lambda x,y: x.append(y), [1,2,3],[])
相当于
[].append(1).append(2).append(3)
由于[].append(1)
没有返回值,即它返回None
,它会尝试执行(在第二步中)
None.append(2)
会导致错误消息Nonetype object has no attribute append