2012-10-25 115 views
1

我想做一個Eratosthenes腳本的簡單篩選,並且我剛剛開始Python和一般編碼,所以我現在不擔心效率。While loop not add right

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.這就是給我的錯誤,但我不明白爲什麼它繼續這樣做。

回答

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 == 1n == numbers[1] == 3。然後,n += numbers[1]結果爲n == 6。但是你不能刪除6次,所以你會得到一個錯誤。

+0

我明白了。謝謝,這真的很有幫助。 – nolefan33