我希望以相同的方式评估以下两个代码块,但似乎并非如此。例如,有了这个:
if True or False and False:
print('True')
else:
print('False')
打印为True。但有了这个:
if (True or False) and False:
print('True')
else:
print('False')
打印错误。这是我对逻辑的细分:
True or False
= True
True and False
= False
通过替换,(True or False) and False
= True and False
= False
。
为什么会这样?
答案 0 :(得分:3)
这是因为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
打印'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
答案 1 :(得分:1)
(True or False)
评估为True
。因此(True or False) and False
评估为True and False
,评估为False
。
这个答案很好地解释了布尔评估的规则:https://stackoverflow.com/a/16069560/1470749
答案 2 :(得分:1)
标准操作顺序使or
优先于True or False and False
,因此第一个语句True or (False and False)
在逻辑上等同于
True
评估为(True or False) and False
。
第二个陈述是
False
评估为utils/people.js
。