while 循环中 if-if-else 和 if-elif-else 的行为差异

Behavioural difference of if-if-else and if-elif-else in a while loop

当使用 'if-if-else' 条件时,我无法获得我想要的输出。但是,使用 'if-elif-else' 效果很好。我尝试过跟踪,但不明白输出差异的原因。我不确定为什么它会在 'if-if-else' 案例执行 1 次后爆发,为什么它不像使用 'if-elif' 时那样执行。

代码如下:除了第 8 行 'if' 被替换为 'elif' 之外,它们完全相同

1.if-if-else

x = 1                                                
y = 0
while True:
    if (x is not None ) & (y%30!=0):
       y+=1
       x=5
       print("x=",x)
    if y%30==0:               #line8
       print("ENTERED y=",y)
       y-=29
    else:
       break

2.if-elif-else

x = 1
y = 0
while True:
    if (x is not None ) & (y%30!=0):
        y+=1
        x=5
        print("x=",x)
    elif y%30==0:              #line8
        print("ENTERED y=",y)
        y-=29
    else:
        break

输出如下:

1.if-if-else

       ENTERED y= 0
       x= 5

2.if-elif-else

       ENTERED y= 0
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       x= 5
       ENTERED y= 0
       x= 5
       x= 5
       x= 5
       x= 5
       ...(prints x=5 for another 29-4 =25 times)
       ENTERED y= 0
       ...(loops endlessly)

当然有区别! elif 代表 else if。 当在 if 之后有另一个 if 时,无论您从第一个 if.

获得的结果如何,都会检查第二个 if

当有 elseelse if(关键点是 else)时,仅当第一个 if 条件结果为 [=17 时才会检查语句=].

请注意,当第 8 行单独使用 if 时,后面的 else 是 "connected" 到第二个 if,但是当使用 elif 所有elsesifs 是 "the same block"。所以在第二种情况下,因为它总是 y % 30 == 0y % 30 != 0(并且 x 不是 None),所以它永远不会到达 break!