在while循环中更改全局变量出现问题

3

我正在尝试解出一串条形码的最后一位,但我在第二个和最后一个while循环中遇到了麻烦。

它们没有为变量totalmOf10分配任何新值。相反,它将它们保留为0,我不明白为什么会这样。

while True:

    number = input("Enter a 7 digit number please.")
    if len(number) == 7:
        try:
            number = int(number)
        except ValueError:
            print("Please enter a number")
        else:
            break
    else:
        print("Please enter a valid number.")

print(number) #DELETE THIS BIT LATER!
i = 0
total = 0

while (i < 7 == True):
    global total
    f = str(number)[i]
    if int(f) % 2 == 1:
        total = total + int(f) * 3
    else:
        total = total + int(f)
    i += 1

print(total)

mOf10 = 0

while True:
    global mOf10
    if mOf10 >= total:
        break
    else:
        mOf10 += 10

finalD = mOf10 - total
print(finalD)

它会打印出您输入的任何7位数字,但不会输出10的倍数或总和。它们只会变成0。

我的老师唯一的解决方案是使用大量的if/else语句。


3
除非它是一个函数,否则您不需要在 while 循环内部使用 global。 - N. Ivanov
total 在这里不是全局变量。它与 main 函数处于相同的作用域。 - Kaushik NP
不是 mOf10 - P.hunter
如果您删除 global totalglobal mOf10 这两行代码,这应该会给您想要的输出结果。 - dalonlobo
我的朋友 i<7==True 总是会是假的!尝试使用 (i<7)==True 或者只用 i<7 - kaza
我把那个拿掉了,但它仍然有同样的问题。 - SleepingSoul
2个回答

1

我不确定你在这里究竟想做什么,但我可以告诉你total的值没有改变的原因是什么。问题在于while循环的condition,即while (i < 7 == True)

>>> i<7
True 
>>> i<7 == True
False

正如您所看到的,由于条件返回False,控制从未进入while循环。

相反,只需做while(i<7)。那应该解决问题。

注意:代码中使用global是错误的,因为totalmOf10的作用域本身就是局部的。

编辑: 奇怪行为的原因是由于比较运算符具有相同的优先级运算符的链接,在Python中,像x < y <= z这样的东西等价于x < y and y <= z

根据Python文档:

形式上,如果a、b、c... y、z是表达式,op1、op2... opN是比较运算符,则a op1 b op2 c ... y opN z等价于a op1 b and b op2 c and ... y opN z,除了每个表达式最多被计算一次。

我们知道这里:

>>> i < 7
True
>>> 7 == True
False

由于运算符的链接,整个条件变为 i < 7 and 7 == True。而由于 7==TrueFalse,因此最终条件的结果为 False

1
更好的是,用更具Python风格的for i in range(7)替换掉i=0, while i < 7, i++的结构。 - Tom Dalton
是的,这样更好。只是在这里指出了原帖作者的问题。 - Kaushik NP
是的,评论更针对楼主而不是你! - Tom Dalton
很高兴能帮忙,并从中学到一些东西。我也刚刚了解到有这样一个怪癖。猜测这是由于优先级发挥作用导致的。稍后会更新答案并进行更深入的解释。 - Kaushik NP
@SleepingSoul,请查看编辑以获取完整说明。 - Kaushik NP
应该指出的是,由于total始终为零,因此mOf10将等于total,并且最后的while循环会立即中断。 - CDspace

0

比较具有相等的优先级..

a<b<c 被评估为 a<b and b<c

所以在你的情况下,i<7==True 被评估为 i<7 and 7==True 意味着要么
1. True and False => False OR
2. False and False => False

所以它总是 False

参考文献见... https://docs.python.org/3/reference/expressions.html#comparisons

请针对 global 的使用做必要的处理


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接