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

问题描述 投票:0回答:4

我有以下代码:

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)

python infinite-loop
4个回答
0
投票

您写了for i in range(2,n):和在起点n=2。因此,您的范围将为range(2,2),因此它将返回空列表,因此此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中零件号将增加1,然后在下一次迭代中,您的for循环将变为for x in range(2,3),因此,此时for循环将成功执行...

对于for...else Reference


1
投票

由于range(2, 2)为空,所以永远不会执行您的内部循环。由于内部循环更新n,因此n从未更改,因此外部循环将永远不会终止。

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

1
投票

最初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)

0
投票
for i in range(2,n):

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

© www.soinside.com 2019 - 2024. All rights reserved.