Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 ';int';对象没有属性'__获取项目';(再次)_Python_Python 2.7_Recursion - Fatal编程技术网

Python ';int';对象没有属性'__获取项目';(再次)

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

我试图递归地找到一个列表的和,如下所示(我知道有一个简单的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
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>都会生成新的列表。当您可以使用原始列表时,为什么要这样做?此外,没有理由进行类似于的操作。pop

x.pop(0)
将删除第一项并返回它。
total\u sum=x.pop()+rsum(x)
应该可以工作。您不需要“让Python明白
x
不应该是int”,您需要修复代码中导致
x
为int的错误。计算机没有误解您,也没有编造问题。