43

将布尔值与==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>都是有效的语法。

4

5 回答 5

56

它与Python中的运算符优先级有关(解释器认为您将 True 与 not 进行比较,因为==它的优先级高于not)。您需要一些括号来阐明操作的顺序:

True == (not False)

通常,您不能not在没有括号的比较右侧使用。但是,我想不出您需要not在比较右侧使用 a 的情况。

于 2011-05-23T16:47:17.780 回答
10

这只是运算符优先级的问题。尝试:

>>> True == (not False)
True

查看此运算符优先级表,您会发现==绑定比 更紧密not,因此True == not False被解析为(True == not) False显然是错误的。

于 2011-05-23T16:47:36.623 回答
2

True == not False声称构成语法错误的原因与运算符优先级有关的答案是错误的。如果是这种情况,表达式2 ** - 1也会产生语法错误,当然不会。优先级永远不会导致在操作数的位置绘制运算符。

成为语法错误的真正原因True == not False是不存在可以从中产生比较的语法规则,因为

比较 ::= or_expr (comp_operator or_expr)*

- 即在 comp_operator==之后必须跟随or_expr,其中包括 xor_expr、and_expr、shift_expr、a_expr、m_expru_expr……,但没有not_test

相比之下,2 ** - 1根据幂规则的优先级相似构造

电源 ::= (await_expr | 主) ["**" u_expr]

u_expr 在幂运算符**之后,因此允许- x在右侧。

于 2021-07-15T21:15:14.347 回答
0

Python 有一个运算符优先级(这就像数学中的 Bodmas。某些运算符在其他运算符之前被考虑。例如:乘法运算符在加法之前被考虑)。在 python 中,'==' 在运算符优先级中位于 'not' 之前。因此,在您的代码行中,Python 分析的第一件事是“False == not”。因为这是不正确的语法,所以会引发错误。

于 2021-07-15T16:17:18.487 回答
-1

我认为您正在寻找的是“而不是”。这将为您提供您正在寻找的结果。如果您比较的布尔值是复合布尔表达式,这里是一个示例网站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
于 2014-01-08T01:24:03.740 回答