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的代码有什么问题。