Python 3.x 为什么还是合并!=有时行为不符合预期

Python 3.x 为什么还是合并!=有时行为不符合预期,python-3.x,comparator,Python 3.x,Comparator,所以我试图创建一个tic-tac-toe游戏,我的一个方法遇到了一个问题,我无法理解为什么它会进行无限循环。我的代码是: def player_input(): marker = '' while marker != 'X' or marker != 'O': marker = input('Do you want to be X or O: ').upper() print(marker) if marker == 'X':

所以我试图创建一个tic-tac-toe游戏,我的一个方法遇到了一个问题,我无法理解为什么它会进行无限循环。我的代码是:

def player_input():
    marker = ''
    while marker != 'X' or marker != 'O':
        marker = input('Do you want to be X or O: ').upper()
        print(marker)

    if marker == 'X':
        return ['X','O']
    return ['O','X']
它目前正在做的是,即使用户输入X或O,它也会不断地问这个问题。当我使用条件时,代码会起作用:

while not (marker == 'X' or marker == 'O'):

问题在于您在检查标记时的逻辑!='X'或标记!='哦

让我们假设marker=='X'。所以我们的表达式计算为False或True,后者的计算结果为True。marker=='O'也是如此。这里的表达式计算为True或False,其计算结果为True

您应该使用and,而不是or

第二个表达式not marker='X'或marker='O'等效于not marker='X'和not marker='O',因此它可以工作

def播放器_输入: 标记= 而马克X'和标记!='O:从“或”更改为“和” marker=输入“您想成为X还是O:”。上限 印刷机 如果标记='X': 返回['X','O'] 返回['O','X'] 问题在于while marker!='X'或标记!='哦

你第一次尝试的结果是,即使marker!='“X”为假标记等于“X”,则标记!='一定是真的。所以它总是再次请求输入,因为它是一个或另一个

假设马克X'是表达式A和标记!='O’是一个表达式B。那么,根据你的说法:

非A和B等同于非A或非B

以及:

非A或B等同于非A和非B

因此,您的最后一次尝试按预期进行,因为:

而不是标记='X'或标记='O':

相当于:


while not marker='X'和not marker='O':

尝试在该行中插入括号:while marker!='X'或标记!='O”:在第一个while循环条件中,当marker='X'时,它也不等于'O'。相反,当它是“O”时,它也不等于“X”。@EricJin or是低优先级操作。用括号检查事物的行为是否不同是一个很好的反射,但在这里它是等效的。这实际上不是python的问题。很明显,这更多的是关于逻辑。也许这是一个偏好的问题,但我发现whilemarker不在X中,O:更容易阅读,特别是当你开始使用超过2个选项时。是的。通常我在'choice 1'中使用a,在'choice 2'中使用a,在a=='choice 1'或a=='choice 2'上使用a,另外使用not in和in与a=='1'或a=='2'相对,也稍微快一点