Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在递归中创建整数数组?_Python_Arrays - Fatal编程技术网

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

Python 如何在递归中创建整数数组?,python,arrays,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' 创建数组时我

下面的代码尝试创建一个整数数组,数组中填充
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'

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

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

return foo(n-1) + [1]  # creates a *new* list

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

>>> [1]*5
[1, 1, 1, 1, 1]

append
返回
None
。这就是问题所在。

您的程序略有更改

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


我列出的方法将一个元素附加到列表中,然后返回列表,这样您的递归就可以按您所希望的那样工作。

只要看看下面的代码就可以理解为什么会出现错误

>>> x = [].append(1)
>>> x is None
True
附加到列表时,返回值为
None
!所以你必须这样做

def foo(n):
    if n == 0:
        return []
    else:
        return foo(n-1) + [1]
使用
+
运算符实际上就像在返回值为新列表的列表上调用
扩展
,而不像
附加

>>> x = [1] + [1]
>>> x
[1, 1]
注意:显然,对于这个简单的示例,您应该使用

>>> [1] * 6
[1, 1, 1, 1, 1, 1]
这对于不可变的
int
s很好,但是如果您处理的对象不希望引用相同的对象

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

但我假设你写这篇文章是为了练习递归解决方案之类的。

…除非你想借此机会学习递归。:)除非你明确地试图学习递归,当然:)我会发布答案,然后在解释中编辑,几秒钟后刷新。@Marcin:haters会讨厌+对我来说是1。@Marcin,对竞争对手的答案投反对票——很好。@jedwards如果一个答案没有用,我就投反对票。如果您认为描述实际问题没有用处,请随意向下投票。当然,当答案被编辑为“有帮助”时,您会删除向下投票,否?初始化列表的更有趣的方式:
list(itertools.repeat(1,6))
,除非确实有理由创建新列表,这将浪费大量时间在每个递归级别复制列表。最好只编写三行代码,省去麻烦
result=foo(n-1)
result.append(1)
返回结果
@HenryKeiter当然有更好的方法(例如,首先不使用递归)。我只是想说明OP的代码有什么问题。