以下代码尝试创建一个填充n
次数为1的整数数组。
import sys
def foo(n):
if n == 0:
return []
else:
return foo(n-1).append(1)
if __name__ == '__main__':
foo(5)
执行此程序会产生错误:
AttributeError: 'NoneType' object has no attribute 'append'
创建阵列时我做错了什么?
答案 0 :(得分:4)
问题出在你的else
- 条款中。 append
不返回新列表,而是在列表中添加元素,然后返回None
(因此您的错误)。试试这个,
return foo(n-1) + [1] # creates a *new* list
答案 1 :(得分:4)
只需查看以下代码即可了解您收到错误的原因,
>>> x = [].append(1)
>>> x is None
True
当您追加到列表时,返回值为None
!所以你必须做这样的事情,
def foo(n):
if n == 0:
return []
else:
return foo(n-1) + [1]
与+
不同,使用extend
运算符就像在返回值是新列表的列表上调用append
一样。
>>> x = [1] + [1]
>>> x
[1, 1]
注意:显然,对于这个简单的例子,你应该使用,
>>> [1] * 6
[1, 1, 1, 1, 1, 1]
对于不可变int
这是好的,但是如果你正在处理你不想引用同一个对象的对象,
>>> [1 for _ in range(6)]
[1, 1, 1, 1, 1, 1]
但我假设你正在写这个来练习递归解决方案等等。
答案 2 :(得分:3)
值得注意的是python有一些很好的语法来覆盖你的用例:
>>> [1]*5
[1, 1, 1, 1, 1]
答案 3 :(得分:1)
您的计划稍有变化
import sys
def foo(n):
if n == 0:
return []
else:
return foo(n-1) + [1]
if __name__ == '__main__':
print(foo(5))
打印
[1, 1, 1, 1, 1]
list.append()
修改列表,但不返回任何内容。因此,到达该分支的函数的递归实际上不返回任何内容或None
。
我列出的方法将一个元素附加到列表中,然后返回列表,这样你的递归就像你想要的那样工作。
答案 4 :(得分:-3)
append
返回None
。这就是问题所在。