为什么' True ==不是假的' Python中的语法错误?

时间:2011-05-23 16:45:19

标签: python boolean

将布尔值与==进行比较在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>是一个有效语法的表达式。

5 个答案:

答案 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”。因为这是不正确的语法,所以会引发错误。