奇怪的reduce行为
当我在 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]
是一个表达式,它会返回一个新的列表,里面包含了原来的列表和新加的内容。