1

我正在尝试制作一个简单的 Eratosthenes 筛选脚本,而且我刚刚开始使用 Python 和一般的编码,所以我现在并不担心效率。

import math
primes = range(2,500)
upperLimit = math.ceil(math.sqrt(float(primes[-1])))

def sieve(numbers):
    for item in range(0,int(upperLimit)):
        n = numbers[item]
        while n < upperLimit:
            n += numbers[item]
            print n
            print numbers
            numbers.remove(n)

sieve(primes)
print primes

这一直告诉我第 12 行中的 numbers.remove(n) 不存在,所以我将打印语句放在它上面以试图弄清楚发生了什么。它运行良好,删除了它应该做的,最多 24。然后,不是再次将 2 添加到 n,而是将 n 更改为 6。这就是给我错误的原因,但我不知道为什么它一直这样做.

4

1 回答 1

2

第一次通过for循环:

item == 0
starting n == 2
removing 4
removing 6
removing 8
removing 10
removing 12
removing 14
removing 16
removing 18
removing 20
removing 22
removing 24

下一次迭代:

item == 1
starting n == 3
removing 6 (but 6 is not in the list, because it has already been removed)
ValueError

如您所料,当item == 1, n == numbers[1] == 3. 然后,n += numbers[1]结果为n == 6。但是你不能删除 6 两次,所以你会得到一个错误。

于 2012-10-25T06:33:12.887 回答