为什么or-combined !=有时不能如愿以偿?

问题描述 投票:0回答:2

所以我想创建一个井字游戏,我的一个方法遇到了一个问题,我想不通为什么它会无限循环。我的代码是这样的。

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'):
python-3.x comparator
2个回答
7
投票

问题是你的逻辑在检查 marker != 'X' or marker != 'O'.

让我们假装 marker == 'X'. 因此,我们的表达式评估为 False or True 它的值为True。同样的情况还有 marker == 'O'. 我们在这里的表达式为 True or False 的值为 True。

你应该使用 and,不 or.

你的第二种表达方式。not (marker == 'X' or marker == 'O') 相当于 (not marker == 'X') and (not marker == 'O'),所以它的工作。(德摩根定律)

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

    if marker == 'X':
        return ['X','O']
    return ['O','X']

2
投票

问题在于 while marker != 'X' or marker != 'O'.

在你第一次尝试的时候,发生的事情是,即使是 marker != 'X'假的 (标记 等于'X'),那么 marker != 'O' 必须是真。所以它又会一直要求输入,因为是 "非此即彼"。

假设 marker != 'X' 是一种表达方式 Amarker != 'O' 是一种表达方式 B. 然后,根据 德摩根定律 你有。

(not (A and B)) is equivalent to ((not A) or (not B))

还有

(not (A or B)) is equivalent to ((not A) and (not B))

因此,你的最后一次尝试和预期一样,因为:

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

相当于:

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

© www.soinside.com 2019 - 2024. All rights reserved.