Python - 为什么这是一个无限循环?

Python - why is this an infinite loop?

我有以下代码:

sum_of_primes = 0
n = 2
while n < 10:
    for i in range(2,n):
        if n%i == 0:
            n += 1
            break
        else:
            sum_of_primes += i
            n += 1
print(sum_of_primes)

我似乎无法弄清楚为什么这是一个无限循环。

下面是我修改后的有效代码,但我仍然不明白为什么原始代码会产生无限循环:

counter = 0
primes = 0
number = 2

while counter < 10:

    for x in range(2, number):
        if number % x == 0:
            number += 1
            counter+=1
            break
    else:

        primes +=number
        counter = number
        number += 1

print(primes)

你的内循环永远不会执行,因为 range(2, 2) 是空的。由于内循环更新 nn 永远不会改变,所以外循环永远不会终止。

n = 2
while n < 10:
    for i in range(2,n):  # list(range(2,2)) == [] ...
        # ... so this loop never executes
        # and n is never updated
    # so this loop runs forever

最初 n2。因此,for 循环是 for i in range(2,2),这是一个空范围,因此循环永远不会执行。这意味着您永远不会进入可能增加 n.

的代码
sum_of_primes = 0
n = 2
while n < 10:      # n == 2
    for i in range(2,n):   # loop repeats zero times
        if n%i == 0:
            n += 1
            break
        else:
            sum_of_primes += i
            n += 1
    # n == 2 still the case down here.
print(sum_of_primes)

您写了 for i in range(2,n): 并且在起点 n=2。所以你的范围将是 range(2,2) 所以它将是 return 空列表所以这个 for 循环永远不会执行并且你的程序将进入无限循环。

在第二个代码中,您使用的是 for...else

for x in range(2, number):
    if number % x == 0:
        number += 1
        counter+=1
        break
else:
    primes +=number
    counter = number
    number += 1

这里,for...else的意思是如果for循环不执行一次,则执行for循环的else部分。在 else 部分你增加了 counternumber.

所以,第一次 number = 2 和 for 循环变成 for x in range(2, number): 意味着 for 循环将不会执行,正如我上面所讨论的,如果 for 循环不是单次执行 else部分将被执行

所以,在else part number 将增加1,然后在下一次迭代中你的for 循环变为for x in range(2,3) 所以,此时for 循环将成功执行...

对于for...else Reference

for i in range(2,n):

这意味着范围是 (2,2) 循环从未开始,因为它的开始和结束与 2-2 相同。