将布尔值与==
进行比较在Python中有效。但是当我应用布尔not
运算符时,结果是语法错误:
Python 2.7 (r27:82500, Sep 16 2010, 18:02:00)
[GCC 4.5.1 20100907 (Red Hat 4.5.1-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> True == True
True
>>> False == False
True
>>> True is not False
True
>>> True == not False
File "<stdin>", line 1
True == not False
^
SyntaxError: invalid syntax
>>>
为什么这是语法错误?我希望not False
是一个返回布尔值的表达式,True == <x>
是有效语法,<x>
是一个有效语法的表达式。
答案 0 :(得分:45)
它与operator precedence in Python有关(解释器认为你将True与not进行比较,因为==
的优先级高于not
。您需要一些括号来阐明操作的顺序:
True == (not False)
一般情况下,如果没有括号,则不能在比较的右侧使用not
。但是,我无法想到你需要在比较的右侧使用not
的情况。
答案 1 :(得分:10)
这只是运营商优先权问题。
尝试:
>>> True == (not False)
True
查看this table of operator precedences,您会发现==
比not
更紧密,因此True == not False
被解析为(True == not) False
错误。
答案 2 :(得分:1)
声称 True == not False
构成语法错误的原因与运算符优先级有关的答案是错误的。如果是这种情况,表达式 2 ** - 1
也会产生语法错误,当然它不会。优先级永远不会导致使用运算符代替操作数。
True == not False
是语法错误的真正原因是不存在会产生 comparison 的语法规则,因为
比较::= or_expr (comp_operator or_expr)*
-我。 e.在 comp_operator ==
之后必须跟随一个 or_expr,其中包括一个 xor_expr、一个 and_expr、一个 shift_expr、一个 a_expr、一个 m_expr、一个 u_expr、一个power...,但没有not_test。
相比之下,优先级相似的构造2 ** - 1
符合幂律
power ::= (await_expr | primary) ["**" u_expr]
在幂运算符 **
后面有 u_expr,因此允许右侧有 - x
。
答案 3 :(得分:0)
我认为你所寻找的是“而不是”。这可以为您提供所期望的结果。如果您的比较布尔值是一个复合布尔表达式,这里是一个示例网站Compound Boolean Expression。
>>> True and True
True
>>> True and not True
False
>>> True and not False
True
>>> False and not True
False
>>> False and not False
False
>>> False and False
False
答案 4 :(得分:0)
Python 有一个运算符优先级(这就像数学中的 Bodmas。某些运算符在其他运算符之前被考虑。例如:乘法运算符在加法之前被考虑)。在python中'=='在运算符优先级中出现在'not'之前。因此,在您的代码行中,Python 分析的第一件事是“False == not”。因为这是不正确的语法,所以会引发错误。