4

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

创建数组时我做错了什么?

4

5 回答 5

4

问题出在您的 -else子句中。append不返回新列表,而是将元素添加到列表中,然后返回None(因此您的错误)。试试这个,

return foo(n-1) + [1]  # creates a *new* list
于 2013-06-19T20:28:02.417 回答
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]

这对于 immutable 来说很好,int但是如果您正在处理不希望引用同一个对象的对象,

>>> [1 for _ in range(6)]
[1, 1, 1, 1, 1, 1]

但我假设你正在写这个来练习递归解决方案等。

于 2013-06-19T20:31:44.413 回答
3

可能值得注意的是,python 有一些很好的语法来涵盖您的用例:

>>> [1]*5
[1, 1, 1, 1, 1]
于 2013-06-19T20:28:05.740 回答
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.

我列出的方法将一个元素附加到列表中,然后返回列表,因此您的递归就像您想要的那样工作。

于 2013-06-19T20:29:11.360 回答
-3

append返回None。这就是问题。

于 2013-06-19T20:28:07.057 回答