Python无限循环引起或复合条件但不使用not()时

Python infinite loop caused by or compound conditional but not when using not()

1
2
3
4
5
6
7
8
9
10
11
    test = ''

# This loop infinitely

    while test != 'O' or test != 'X':
        test = raw_input("Enter:").upper()

# This works fine  

    while not(test == 'O' or test == 'X'):
        test = raw_input("Enter:").upper()

放置not和使用!=之间有什么区别?


问题在于你的结合:你未能正确应用DeMorgan的法律。 在分配否定时,您需要从or翻转到and

1
not(test == 'O' or test == 'X')

相当于

1
test!= 'O' and test!= 'X'

查看test!= 'O' or test!= 'X'的逻辑:无论你给test赋予什么字符,它都不等于两个测试字符中的至少一个。 F0r O,第二个子句是True; 对于X,第一个是True; 对于任何其他字符,两个子句都是True。 要超越这个,你需要一个同时XO的角色。

我们不是在Python中做量子变量......至少还没有。 您必须编写一个带有自定义相等运算符的新类来使其工作。


...如果你一直去Pythonic,你会写

1
while not test in ('O', 'X'):

或 - 甚至更简单

1
while not test in 'OX':