Python Eratosthenes筛返回较大的合成数(这是一个错误)

Python Eratosthenes筛返回较大的合成数(这是一个错误),python,algorithm,python-3.x,primes,sieve-of-eratosthenes,Python,Algorithm,Python 3.x,Primes,Sieve Of Eratosthenes,我正在用Python实现Eratosthenes筛。它返回搜索范围末尾附近的复合数字: def primes_Ero(n=1000): primes = [] a = [True]*(n+1) a[0] = a[1] = False for (i,isprime) in enumerate(a): if isprime: for n in range(i*i,n+1, i):

我正在用Python实现Eratosthenes筛。它返回搜索范围末尾附近的复合数字:

def primes_Ero(n=1000):
    primes = []
    a = [True]*(n+1)
    a[0] = a[1] = False
    for (i,isprime) in enumerate(a):
        if isprime:
            for n in range(i*i,n+1, i):          
                a[n] = False
            primes.append(i)
    return primes
当使用较大的数字n时,我最终得到的是复合数字。我检查了一下哪些数字是复合的(与蛮力法相比)

给定n,哪些数字是复合的:

n= 100; []
n= 500; [493, 497]
n= 1000; [961, 989]
n= 10000; [9701, 9727, 9797, 9853, 9869, 9917, 9943, 9953, 9983, 9991, 9997]

我做错了什么?

问题是这行:

 for n in range(i*i, n+1, i):
最初
n
设置为参数值(默认值=1000),但在for循环第一次执行后,n将保持
i
。第二次执行for循环时出错

您应该重命名正在使用的
n
s之一。考虑给它一个适当的名字,比如“代码> SeaveEsithSuth[/Cord]”,它更能描述它实际所做的事情。
我想指出的一点是,虽然代码很聪明,但您正在修改迭代的列表。这通常被认为是不好的做法。

如果i==31:
,那么
的意图是什么?另外,你用
n
来处理两件不同的事情。@PaulHankin明白了。更改内部for循环中的变量,例如:
范围内的k(i*i,n+1,i):
问题就会消失。我用它来检查不同的错误。我将对其进行编辑以删除it@jas这就解决了!谢谢你谢谢你!我正在整理一些不同的想法,却忘了将这些部分重命名为描述性的。这帮了大忙。对上一段的评论:在遍历列表时按索引修改列表的值没有问题。只有在列表中间插入或删除值时才会出现问题(因为这会更改所有后面值的索引)。