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
和使用!=
有什么区别?
问题是你的连词:你没有正确地应用德摩根定律。 当你分发否定时,你需要从or
翻转到and
。
not(test == 'O' or test == 'X')
相当于
test!= 'O' and test!= 'X'
看看test!= 'O' or test!= 'X'
的逻辑:无论你给test
什么字符,它都不会等于两个测试字符中的至少一个。F0rO
,第二句为True
;对于X
,第一个是True
;对于任何其他字符,这两个子句都True
。 要克服这个问题,你需要一个同时X
和O
的角色。
我们不是在用Python做量子变量...至少现在还没有。 您必须使用自定义相等运算符编写一个新类才能完成此操作。
...如果你一路走Pythonic,你会写
while not test in ('O', 'X'):
或者 - 甚至更简单
while not test in 'OX':