gpt4 book ai didi

python - 'int' 对象没有属性 '__getitem__'(再次)

转载 作者:行者123 更新时间:2023-11-28 20:21:00 25 4
gpt4 key购买 nike

我正在尝试按如下方式递归地查找列表的总和(我知道有一个简单的 sum() 函数和许多其他方法):

def rsum(x):

if not (x):
return 0
else:
sum = x[0] + rsum(x.pop(0))
return sum

但是,Python 一直告诉我 x 是一个 int,不能有运算符 []。我该如何解决?

对于那些认为我懒得在这里问这个问题的人:我到处都看过但仍然不知道如何让 Python 理解 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

如果你想避免改变原始对象,那么使用 slicing创建没有第一个元素的新列表,就像这样

def rsum(x):
if not x:
return 0
else:
return x[0] + rsum(x[1:])

print rsum([1, 2, 3])
# 6

既然你正在学习递归,我希望你考虑一下Tail Call optimization以及。你可以像这样稍微改变你的功能

def rsum(x, total):
if not x:
return total
else:
return rsum(x[1:], total + x[0])

print rsum([1, 2, 3], 0)
# 6

在早期的情况下,直到你达到你的基本条件(if not x:)当前函数不能从内存中取出(因为x[0]x.pop() 在当前堆栈中,它们必须加上递归调用的结果才能真正从当前函数返回)。所以,当你在一个非常大的列表上运行这个函数时,它会用完堆栈空间。但是,在 TCO 版本中,您将返回另一个函数调用的结果。因此,当前函数不必在内存中。

注意: 也就是说,Python 不支持尾调用优化。阅读 BDFL(Guido)对此有何评论 here .

关于python - 'int' 对象没有属性 '__getitem__'(再次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29293880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com