【问题标题】:How are conditional statements with multiple conditions evaluated?如何评估具有多个条件的条件语句?
【发布时间】:2016-09-19 04:04:56
【问题描述】:

我希望以相同的方式评估以下两个代码块,但情况似乎并非如此。例如,这样:

if True or False and False:
    print('True')                                                               
else:                                                                           
    print('False')

True 被打印出来。但是有了这个:

if (True or False) and False:
    print('True')
else:                                                                           
    print('False')

False 被打印出来。这是我的逻辑分解:

  • True or False = True
  • True and False = False

通过替换,(True or False) and False = True and False = False

为什么会这样?

【问题讨论】:

    标签: python


    【解决方案1】:

    这是因为operator precedence。根据 Python 2.x 和 3.x 文档,and 运算符的优先级高于 or 运算符。另外,看看布尔真值表:

    这意味着在你的表达中:

    if True or False and False:
    

    在表达式中,False and False 因为优先级而被组合在一起。这意味着 Python 将其评估为:

    if True or (False and False):
    

    现在,它从左到右进行评估。由于第一个条件是True,它会短路并跳过第二个条件并评估为True 打印“真”。 (这会短路,因为如果第一面为真,它必须为真。)

    现在在你的第二个例子中:

    if (True or False) and False:
    

    这使得True or False 首先评估,从而得到True。然后它执行True and False,即False,打印'False'。

    >>> print(True or False)
    True
    >>> print(True and False)
    False
    

    【讨论】:

    • 这与短路无关。非短路评估会产生相同的结果。
    • 您仍然对优先级一无所知。根据您的回答逻辑,False and True or True 将是 False
    • @user2357112 我已经更新了答案以包含正确的信息。感谢您指出错误信息和批评,非常感谢!
    • 好吧,您解决了优先级问题,但现在您的答案是使用了错误的评估顺序。优先级只控制参数分组,而不是评估顺序;表达式仍然从左到右进行评估并短路。
    • @user2357112 再次正确。更新:)
    【解决方案2】:

    (True or False) 的计算结果为 True。因此,(True or False) and False 的计算结果为 True and False,后者的计算结果为 False

    这个答案很好地解释了布尔评估的规则:https://stackoverflow.com/a/16069560/1470749

    【讨论】:

      【解决方案3】:

      标准运算顺序使and 优先于or,因此第一条语句True or False and False 在逻辑上等价于

      True or (False and False)
      

      计算结果为True

      第二条语句是

      (True or False) and False
      

      计算结果为False

      【讨论】:

        猜你喜欢
        • 2015-03-22
        • 1970-01-01
        • 1970-01-01
        • 2019-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-20
        • 2016-02-20
        相关资源
        最近更新 更多