Python:通过递归函数调用传递列表会导致列表变为“NoneType”,为什么?

时间:2014-02-15 02:17:12

标签: python recursion nonetype

我有以下递归函数:

def recurse(y,n):
    if len(y) == n:
        return y
    else:
        return recurse(y.append(1),n)

当我运行它时:

x=recurse([],10)

我收到以下错误:

TypeError: object of type 'NoneType' has no len()

似乎函数第一次超过if语句,然后进入下一级递归,并且y.append(1)是'NoneType',为什么不是:'[1 ]'如预期的那样?我已经考虑了一段时间,我似乎无法弄明白。任何见解都表示赞赏!

3 个答案:

答案 0 :(得分:12)

问题在于:

y.append(1)

append()方法返回None,因此您无法传递其结果以构建输出列表(您必须先将append添加到列表中然后传递,如其他答案所示)。试试这个:

def recurse(y, n):
    if len(y) == n:
        return y
    else:
        return recurse(y + [1], n)

上述解决方案更符合函数式编程风格。使用append向现有列表添加元素 - 这将改变函数参数,通常不是一个好主意。另一方面,y + [1]每次创建一个新列表,保持参数不变。功能编程的支持者会告诉你这是一件好事。

答案 1 :(得分:5)

list.append()在列表中调用append方法,当它修改列表时,它会返回None

所以它不会返回列表。

你想要这样的东西:

def recurse(y,n):
    if len(y) == n:
        return y
    else:
        y.append(1)
        return recurse(y,n) # explicitly pass the list itself

答案 2 :(得分:3)

y.append在y上运行并返回None