Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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 - Fatal编程技术网

Python 为什么接收到索引超出范围错误?

Python 为什么接收到索引超出范围错误?,python,Python,我试着做斐波那契数列,但不是用过去的2个数做第三个数,而是用最后的3个数做第四个数 我的第一个代码是: def tribonacci(signature, n): a, b, c = signature tribo = [signature[0],signature[1],signature[2]] for i in range(n): s = a+b+c a = b b = c c = s

我试着做斐波那契数列,但不是用过去的2个数做第三个数,而是用最后的3个数做第四个数 我的第一个代码是:

def tribonacci(signature, n):
    a, b, c = signature
    tribo = [signature[0],signature[1],signature[2]]

    for i in range(n):
        s = a+b+c
        a = b
        b = c
        c = s
        tribo.append(c)
    return tribo

print(tribonacci([1, 1, 1], 10))
我收到[1,1,1,3,5,9,17,31,57,105,193,355,653],这意味着序列从数字3开始,而不是从第一个1开始。但我不想将“签名”值附加到数组中,而是开始将每个值添加到数组中

因此,我尝试了以下代码:

def tribonacci(signature, n):
    tribo = []

    for i in range(0, n):
        a = signature[i]
        b = signature[2*i]
        c = signature[3*i]
        s = a+b+b
        a = b
        b = c
        c = s
        tribo.append(c)
    return tribo


print(tribonacci([1, 1, 1], 10))

我本来希望得到这个[1,1,1,3,5,9,17,31,57,105],但是错误索引超出范围出现

在第二个示例中,您处理的是两个不同的列表:
tribo
签名
。当您增加
i
的索引时,您尝试从
签名
获取该索引,但是
签名
只有三个元素,因此当
i*3>2
时,您会得到一个
索引器

解决此问题的更好方法不是创建两个不同的数组,而是使用原始代码,然后从返回的数组中切掉前三个元素:

def tribonacci(signature, n):
    a, b, c = signature
    ...
    return tribo[3:]
您不必使用三个不同的变量来存储这三个元素,还可以利用python的负列表incides思想(从后面而不是从前面开始计数)。这样做的
tribonaci
的更简洁实现可能如下所示:

def tribonacci(signature, n):
    tribo = signature[:]  # copy the contents of signature, to start with
    for i in range(n):
        # add the last three elements of tribo together, and append the sum
        tribo.append(
            tribo[-1] + tribo[-2] + tribo[-3]
        )
    return tribo[3:]

虽然如果给定的
签名小于3个元素,这将为您提供一个
索引器

在第二个示例中,您处理的是两个不同的列表:
tribo
签名
。当您增加
i
的索引时,您尝试从
签名
获取该索引,但是
签名
只有三个元素,因此当
i*3>2
时,您会得到一个
索引器

解决此问题的更好方法不是创建两个不同的数组,而是使用原始代码,然后从返回的数组中切掉前三个元素:

def tribonacci(signature, n):
    a, b, c = signature
    ...
    return tribo[3:]
您不必使用三个不同的变量来存储这三个元素,还可以利用python的负列表incides思想(从后面而不是从前面开始计数)。这样做的
tribonaci
的更简洁实现可能如下所示:

def tribonacci(signature, n):
    tribo = signature[:]  # copy the contents of signature, to start with
    for i in range(n):
        # add the last three elements of tribo together, and append the sum
        tribo.append(
            tribo[-1] + tribo[-2] + tribo[-3]
        )
    return tribo[3:]

虽然如果给定的
签名小于3个元素,这将为您提供一个
索引器

我认为错误在于调用数组:

for i in range(0, n):
    a = signature[i]
    b = signature[2*i]
    c = signature[3*i]
…应该是

for i in range(0, n):
    a = signature[i]
    b = signature[1+i]
    c = signature[2+i]
否则,当n=10时,您将访问不存在的签名(30)

还有其他错误,例如
s=a+b+b
而不是
s=a+b+c
,仅此编辑无法解决问题,但这可能就是您收到越界错误的原因

否则,最大的错误是使用两个不同的数组。您的
tribo
数组从未使用起始1初始化,因此无法成为所需的结果。为了保持核心代码不变,我只需将for循环的范围更改为
(0,n-3)
,或者使用
签名来代替tribo

def tribonacci(signature, n):
    for i in range(0, n-3):
        a = signature[i]
        b = signature[1+i]
        c = signature[2+i]
        s = a+b+c
        a = b
        b = c
        c = s
        signature.append(c)
    return signature
print(tribonacci([1, 1, 1], 10))

我认为错误在于调用数组:

for i in range(0, n):
    a = signature[i]
    b = signature[2*i]
    c = signature[3*i]
…应该是

for i in range(0, n):
    a = signature[i]
    b = signature[1+i]
    c = signature[2+i]
否则,当n=10时,您将访问不存在的签名(30)

还有其他错误,例如
s=a+b+b
而不是
s=a+b+c
,仅此编辑无法解决问题,但这可能就是您收到越界错误的原因

否则,最大的错误是使用两个不同的数组。您的
tribo
数组从未使用起始1初始化,因此无法成为所需的结果。为了保持核心代码不变,我只需将for循环的范围更改为
(0,n-3)
,或者使用
签名来代替tribo

def tribonacci(signature, n):
    for i in range(0, n-3):
        a = signature[i]
        b = signature[1+i]
        c = signature[2+i]
        s = a+b+c
        a = b
        b = c
        c = s
        signature.append(c)
    return signature
print(tribonacci([1, 1, 1], 10))

在第二个代码中,您尝试在各种索引中访问签名。但实际上您从未更改该列表,因此它始终保持
[1,1,1]
(这意味着在索引>2处的任何访问都将失败)。在第二个代码中,您尝试在不同索引处访问
签名。但实际上您从未更改该列表,因此它始终保持
[1,1,1]
(这意味着在索引>2处的任何访问都将失败)。此解决方案(放置的最后一块代码)的问题在于它修改了
签名
,而OP可能不希望这样做。这可以通过在函数开始时通过
signature=signature[:]
简单地复制
signature
来解决(尽管这有点黑客行为)@greencloffguy确实,根据所需的行为,有很多解决方案,直到OP。我假设一旦他发现索引OOB错误,很可能是由于签名[2*I]引起的,他会在以后随心所欲地继续使用它。这个解决方案的问题(您放置的最后一块代码)是它修改了
签名
,而OP可能不希望这样。这可以通过在函数开始时通过
signature=signature[:]
简单地复制
signature
来解决(尽管这有点黑客行为)@greencloffguy确实,根据所需的行为,有很多解决方案,直到OP。我假设,一旦他发现索引OOB错误,很可能是由于签名[2*I]引起的,他会在以后随心所欲地继续使用它。