奇怪的reduce行为

12 投票
4 回答
1066 浏览
提问于 2025-04-16 18:18

当我在 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 个回答

6

在使用reduce这个函数时,传入的操作函数需要返回一个结果。

x+[y] 这样做是可以的,因为它会返回一个新的结果,而 x.append(y) 就不行(因为它是直接修改了x,并且返回的是None)。

7

reduce这个函数会调用你给它的函数,并把返回的结果当作新的结果。可是,append这个函数返回的是None,所以下一次调用append的时候就会出错。你可以这样写:

def tmpf(x,y):
   x.append(y)
   return x
reduce(tmpf, [1,2,3], [])

这样就能得到正确的结果。不过,如果你得到的结果是一个和输入一样大小的列表,那你就不需要用reduce了:reduce的结果通常应该是一个单一的值。相反,你可以使用map,或者直接使用

[x for x in [1,2,3]]
16

x.append(y)x+[y] 是不一样的。append 是直接在原来的列表上添加内容,并且不会返回任何东西;而 x+[y] 是一个表达式,它会返回一个新的列表,里面包含了原来的列表和新加的内容。

撰写回答