循环内索引2超出范围

0 投票
1 回答
597 浏览
提问于 2025-04-17 16:33

我遇到了一个很奇怪的错误。我有一个叫做 ten.py 的模块,里面包含了以下内容:

import math

def go():
    list_ = list(range(3, 100000, 2))
    max_ = int(math.sqrt(len(list_)))
    print(len(list_))
    print(max_)
    for i in range(1,max_):
        print(i)
        current = list_[i]
        for j in list_[i+1:]:
            if j % i == 0:
                list_.remove(j)
go()

输出结果是:

49999
223
1
2
Traceback (most recent call last):
  File "D:\Documents\KomodoProjects\Project Euler\ten.py", line 14, in <module>
    go()
  File "D:\Documents\KomodoProjects\Project Euler\ten.py", line 10, in go
    current = list_[i]
IndexError: list index out of range

你可以看到这个列表的大小是 49999,但循环只执行到 223。尽管如此,它在索引为 2 的时候就已经报出“索引超出范围”的错误了!

在循环里面的 list_ 是不是没有正确指向 go() 函数里面的 list_?我完全搞不懂为什么会出现这个问题。

这个问题通过把

for i in range(1,max_):

改成

for i in list_:

1 个回答

0

你的问题是这样的:

你有一个 for 循环,它在从 list_ 中删除数字。结果删除了太多数字,导致 list_ 只剩下两个元素,然后当你尝试访问 list_[2] 时就出错了,因为这个位置已经不存在了。

之所以删除了这么多数字,是因为你在计算 x % 1 == 0,这个条件对任何值的 x 都是成立的。由于你是从列表的第二个位置开始的,所以你删除了这个位置之后的所有内容。

我不太确定你具体在做什么,但无论如何,这种做法都会很慢。看起来你是在筛选质数……你可以去谷歌搜索一下“Python 找质数”之类的内容。

撰写回答