Python ';int';对象没有属性'__获取项目';(再次)
我试图递归地找到一个列表的和,如下所示(我知道有一个简单的sum()函数和很多其他方法): 然而,Python一直告诉我x是一个int,不能有操作符[]。我该如何解决这个问题 对于那些认为我懒得在这里问这个问题的人:我到处找了,但仍然不知道如何让Python理解Python ';int';对象没有属性'__获取项目';(再次),python,python-2.7,recursion,Python,Python 2.7,Recursion,我试图递归地找到一个列表的和,如下所示(我知道有一个简单的sum()函数和很多其他方法): 然而,Python一直告诉我x是一个int,不能有操作符[]。我该如何解决这个问题 对于那些认为我懒得在这里问这个问题的人:我到处找了,但仍然不知道如何让Python理解x不应该是int。x.pop(0)将删除第一项并返回它。您正在将其传递给rsum,它正在尝试执行x[0],但是x现在是一个数字。这就是它失败的原因 相反,先使用pop,然后像这样将x传递到rsum def rsum(x): if
x
不应该是int。x.pop(0)
将删除第一项并返回它。您正在将其传递给rsum
,它正在尝试执行x[0]
,但是x
现在是一个数字。这就是它失败的原因
相反,先使用pop
,然后像这样将x
传递到rsum
def rsum(x):
if not x:
return 0
else:
return x.pop() + rsum(x)
print rsum([1, 2, 3])
# 6
def rsum(x):
if not x:
return 0
else:
return x[0] + rsum(x[1:])
print rsum([1, 2, 3])
# 6
def rsum(x, total):
if not x:
return total
else:
return rsum(x[1:], total + x[0])
print rsum([1, 2, 3], 0)
# 6
如果要避免改变原始对象,请使用创建没有第一个元素的新列表,如下所示
def rsum(x):
if not x:
return 0
else:
return x.pop() + rsum(x)
print rsum([1, 2, 3])
# 6
def rsum(x):
if not x:
return 0
else:
return x[0] + rsum(x[1:])
print rsum([1, 2, 3])
# 6
def rsum(x, total):
if not x:
return total
else:
return rsum(x[1:], total + x[0])
print rsum([1, 2, 3], 0)
# 6
既然你在学习递归,我希望你也考虑一下。你可以像这样稍微改变一下你的函数
def rsum(x):
if not x:
return 0
else:
return x.pop() + rsum(x)
print rsum([1, 2, 3])
# 6
def rsum(x):
if not x:
return 0
else:
return x[0] + rsum(x[1:])
print rsum([1, 2, 3])
# 6
def rsum(x, total):
if not x:
return total
else:
return rsum(x[1:], total + x[0])
print rsum([1, 2, 3], 0)
# 6
在以前的情况下,除非达到基本条件(如果不是x:
),否则当前函数无法从内存中取出(因为x[0]
或x.pop()
在当前堆栈中,它们必须与递归调用的结果一起添加,才能从当前函数实际返回)。因此,当您在非常大的列表上运行此函数时,它将耗尽堆栈空间。但是,在TCO版本中,您将返回另一个函数调用的结果。因此,当前函数不必在内存中
注意:也就是说,Python不支持尾部调用优化。阅读BDFL(Guido)对此的说明。如果您有一个错误,而该错误对于您期望对象具有的值似乎没有意义,请尝试打印它以查看它具有的值: 给出此输出:
[1, 2, 3]
1
因此,您第一次调用rsum
时,它有一个预期的列表;第二次它有一个数字。您可以在交互式解释器中玩转,找出原因:
>>> x = [1,2,3]
>>> x.pop(0)
1
>>> x
[2, 3]
因此,pop
修改列表,但调用的结果是删除的项目。你可以利用这个事实得出如下结论:
sum = x.pop(0) + rsum(x)
非常简单的例子:
def rec_sum(x, n):
if not n:
return x[0]
return x[n] + rec_sum(x, n-1)
print rec_sum(x, len(x)-1)
这个版本比《四人行》发布的所有示例更有效,因为在Python中,每个x[1:][/strong>都会生成新的列表。当您可以使用原始列表时,为什么要这样做?此外,没有理由进行类似于的操作。popx.pop(0)
将删除第一项并返回它。total\u sum=x.pop()+rsum(x)
应该可以工作。您不需要“让Python明白x
不应该是int”,您需要修复代码中导致x
为int的错误。计算机没有误解您,也没有编造问题。