奇怪的减少行为

时间:2011-05-25 12:40:44

标签: python

当我在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'

为什么这两行代码没有给出相同的结果?

4 个答案:

答案 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