我有以下递归函数:
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 ]'如预期的那样?我已经考虑了一段时间,我似乎无法弄明白。任何见解都表示赞赏!
答案 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