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

Python-大型初始化列表上的索引超出范围,python,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:

我是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,则会产生越界错误。但是,缓存应该初始化为一百万整数。我错过什么了吗?谢谢

代码发布后立即更新:

到1500年为止,我似乎没有遇到任何问题。对于
func(1819)
,我确实得到了一个索引器,对于这个索引器,我的进化开始了

1819
5458
2729
最后在

851290
425645
1276936
[...]
IndexError: list index out of range
但这不是一个bug,这只是一个事实,它比你腾出的空间要高。您可以使用字典而不是列表来避免此问题

--

要说清楚,我想说的是:

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
,但我会做什么取决于你想做什么。

代码发布后更新:

到1500年为止,我似乎没有遇到任何问题。对于
func(1819)
,我确实得到了一个索引器,对于这个索引器,我的进化开始了

1819
5458
2729
最后在

851290
425645
1276936
[...]
IndexError: list index out of range
但这不是一个bug,这只是一个事实,它比你腾出的空间要高。您可以使用字典而不是列表来避免此问题

--

要说清楚,我想说的是:

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个或少1个,你可能不会遇到问题


如果您真的想缓存结果,DICT比Python中稀疏数组的列表更合适。

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

你可能只是碰到了一个数字,使得它在一段时间内增长得比崩溃得快。如果你输入的比你输入的多1个或少1个,你可能不会遇到问题



如果您真的想缓存结果,DICT比Python中稀疏数组的列表更合适。

k
也没有明确提到。。。我们假设
i
初始化为2或更大。i将在1到1000000@HarrisonHe:仅保证
i=2**k
的collatz序列保持在
i
以下<例如,code>i=3在返回到1之前先升到16。嗯,如何将字典初始化为一百万个值?我也没有完全理解这个列表structure@HarrisonHe:不需要,只需在值出现时添加它们。
k
也没有明确提到。。。我们假设
i
初始化为2或更大。i将在1到1000000@HarrisonHe:仅保证
i=2**k
的collatz序列保持在
i
以下<例如,code>i=3在返回到1之前先升到16。嗯,如何将字典初始化为一百万个值?我也没有完全理解这个列表structure@HarrisonHe:如果没有,则在出现值时添加它们。
k
a
i
在循环之前没有明确提到。你能发布更多的代码吗,比如它包含了这些变量的初始化?对不起,添加了一个更完整的代码最终数组将作为一个参数传入,但我在函数中初始化了它,以消除导致错误的任何其他原因Collatz猜想,嗯?在这里预先初始化数组是浪费内存(和时间)。这是一次记忆化尝试吗?如果您想让记忆化发挥任何作用,您需要在调用函数之间保留数据。
k
a
i
在循环之前没有明确提到。你能发布更多的代码吗,比如它包含了这些变量的初始化?对不起,添加了一个更完整的代码最终数组将作为一个参数传入,但我在函数中初始化了它,以消除导致错误的任何其他原因Collatz猜想,嗯?在这里预先初始化数组是浪费内存(和时间)。这是一次记忆化尝试吗?如果您想让记忆化发挥任何作用,则需要在调用函数之间保留数据。