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

Python—为什么这是一个无限循环?,python,infinite-loop,Python,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) 素数之和=0 n=2 当n

我有以下代码:

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)

素数之和=0
n=2
当n<10时:
对于范围(2,n)内的i:
如果n%i==0:
n+=1
打破
其他:
素数之和+=i
n+=1
打印(素数之和)
我似乎不明白为什么这是一个无限循环

下面是我修改过的代码,它可以工作,但我仍然不明白为什么原始代码会创建一个无限循环:

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)

计数器=0
素数=0
数字=2
当计数器<10时:
对于范围内的x(2,编号):
如果编号%x==0:
数字+=1
计数器+=1
打破
其他:
素数+=数
计数器=数字
数字+=1
打印(素数)

由于
范围(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
n=2
当n<10时:
对于范围(2,n)中的i:#列表(范围(2,2))=[]。。。
# ... 所以这个循环永远不会执行
#n永远不会更新
#所以这个循环永远运行

由于
范围(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
n=2
当n<10时:
对于范围(2,n)中的i:#列表(范围(2,2))=[]。。。
# ... 所以这个循环永远不会执行
#n永远不会更新
#所以这个循环永远运行

最初
n
2
。因此,的
循环是范围(2,2)
中的i的
,该范围为空,因此循环永远不会执行。这意味着您永远不会进入可能增加
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
n=2
当n<10时:#n==2
对于范围(2,n)内的i:#循环重复零次
如果n%i==0:
n+=1
打破
其他:
素数之和+=i
n+=1
#n==2下面的情况仍然如此。
打印(素数之和)

最初
n
2
。因此,
循环是范围(2,2)
中的i的
,该范围为空,因此循环永远不会执行。这意味着您永远不会进入可能增加
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
n=2
当n<10时:#n==2
对于范围(2,n)内的i:#循环重复零次
如果n%i==0:
n+=1
打破
其他:
素数之和+=i
n+=1
#n==2下面的情况仍然如此。
打印(素数之和)

您为范围(2,n)内的i编写了
并且在起始点
n=2
。因此,您的范围将是
range(2,2)
,因此它将返回空列表,这样这个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
部分,增加
计数器
编号

因此,第一次
number=2
并且对于范围(2,number)内的x,for循环变为
循环的平均值将不会执行,因此,如上文所述,如果for循环不超过一次
,否则将执行部分

因此,在
中,否则
零件号将增加1,然后在下一次迭代中,对于范围(2,3)内的x,for循环将变为
因此,此时for循环将成功执行


对于
For…else

您为范围(2,n)内的i编写了
并且在起始点
n=2
。因此,您的范围将是
range(2,2)
,因此它将返回空列表,这样这个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
部分,增加
计数器
编号

因此,第一次
number=2
并且对于范围(2,number)内的x,for循环变为
循环的平均值将不会执行,因此,如上文所述,如果for循环不超过一次
,否则将执行部分

因此,在
中,否则
零件号将增加1,然后在下一次迭代中,对于范围(2,3)内的x,for循环将变为
因此,此时for循环将成功执行

对于
For…else

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


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

谢谢。我现在明白了,但我仍然感到困惑,因为第二个代码在我应该有相同的空范围问题的地方工作。谢谢。我现在明白了,但我仍然感到困惑的是,第二个代码在我应该有相同的空范围问题的地方工作。这是有道理的。谢谢,但是第二个代码在我应该有相同的空范围问题的地方工作。这是有意义的。谢谢,但是第二个代码在我应该有相同的空范围问题的地方起作用。@abramo我为您的查询更新了我的答案,请检查,如果您不理解请告诉我。是的,很好,愉快的编码:)@abramo我为您的查询更新了我的答案,请检查,如果您不理解请告诉我。是的,很好,快乐编码:)