如何在递归中创建整数数组?

时间:2013-06-19 20:25:25

标签: python arrays

以下代码尝试创建一个填充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'

创建阵列时我做错了什么?

5 个答案:

答案 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。这就是问题所在。