Python - 索引超出大型初始化列表的范围

时间:2012-06-08 00:38:34

标签: python

我是Python的初学者,我遇到了一个奇怪的出界错误。

我的想法是我需要使用以下命令初始化缓存:

arr = [0]*1000000

然后通过调用

在同一个函数中访问
def func (i) :
    k=1
    a = i
    arr = [0]*1000000
    while (i>1):    
        if arr[i] != 0:
            k = k + arr[i] - 1
            break
        if i%2 == 0:
            i = i/2
        else:
            i = 3*i + 1
        k += 1
    arr[a] = k
    return k

如果值i超过1500,它会给我一个越界错误。但是,缓存应该被初始化为一百万个整数。我错过了什么吗?感谢

2 个答案:

答案 0 :(得分:3)

现已更新代码已发布:

我似乎没有遇到任何问题,直到1500.我获得func(1819)的IndexError,i evolution开始为

1819
5458
2729

并结束

851290
425645
1276936
[...]
IndexError: list index out of range

但这不是一个错误,这只是一个事实,它比你腾出的空间更高。您可以使用字典而不是列表来避免此问题。

-

要清楚,这就是我想到的那种事情:

def func_with_dict(i) :
    k=1
    a = i
    arr = {}
    while (i>1):    
        print i
        if i in arr:
            k = k + arr[i] - 1
            break
        if i%2 == 0:
            i = i/2
        else:
            i = 3*i + 1
        k += 1
        arr[a] = k
    return k

产生

1819
5458
2729
8188
[...]
851290
425645
1276936
638468
319234
[...]
20
10
5
16
8
4
2

和162的最终答案。虽然我不认为我会以这种方式使用arr,但我做什么取决于你想要做什么做。

答案 1 :(得分:3)

此函数在最终崩溃之前可以任意增长。

你可能只是打了一些数字,这使得它的成长速度比它崩溃了一段时间。如果你输入的数量比你传入的少一个或少一个,你可能不会遇到问题。

如果确实想要缓存结果,那么dicts比Python中的稀疏数组列表更合适。