井字棋游戏中Python while循环与input函数逻辑问题求助
井字棋游戏While循环逻辑问题解析
我在开发第一个Python项目——井字棋游戏时,碰到了while循环的逻辑坑:写了个让玩家选择X/O标记的函数,但哪怕输入正确的X或O,循环还是会一直重复询问。
我的原函数代码:
def player_input(): marker = '' while marker != 'X' or marker != 'O': marker = input('Player 1 choose X or O ').upper() if marker == 'X': return ('X','O') else: return ('O','X')
后来看到解决方案,把while条件改成下面这样就正常了:
while not (marker == 'X' or marker == 'O'):
一开始我以为这两个逻辑是等价的,其实完全不是,问题出在对逻辑运算符or的理解上:
- 你写的
marker != 'X' or marker != 'O'永远为真。不管marker是什么值,总有一个条件成立:- 如果输入X,
marker != 'O'是真,整个or表达式结果为真; - 如果输入O,
marker != 'X'是真,整个or表达式结果还是真; - 哪怕输入其他字符,两个条件至少一个也成立。
结果就是循环永远不会终止。
- 如果输入X,
而正确写法的逻辑是:只有当输入不合法(既不是X也不是O)时,才继续循环。拆解来看:
- 括号内的
marker == 'X' or marker == 'O'表示“输入是合法的X或O”; - 前面加
not,就变成“输入不合法”,这时候才进入循环要求重新输入;一旦输入合法,条件为假,循环终止。
另外还有个更直观的等价写法,可读性更好:
while marker not in ['X', 'O']:
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

