为什么'True == not False'是Python中的语法错误?

Tim*_*tin 33 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
>>> 
Run Code Online (Sandbox Code Playgroud)

为什么这是语法错误?我希望not False是一个返回布尔值的表达式,并且True == <x>只要<x>是具有有效语法的表达式,它就是有效的语法.

Raf*_*ler 46

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

True == (not False)
Run Code Online (Sandbox Code Playgroud)

一般情况下,如果not没有括号,则不能在比较的右侧使用.但是,我想不出你需要not在比较的右侧使用a 的情况.

  • *Logical*inversion在Python中的优先级较低.相反,算术否定(一元`-`)和按位反转(`~`)都具有相当高的优先级. (5认同)
  • 当然,就像Python中的几乎所有内容一样,它非常有意义,因为"== not"看起来都很奇怪,并且在大多数情况下可以用`!=`代替. (2认同)
  • @JimClay原因可能是与其他比较运算符的一致性,在我看来,这种优先级是完全有意义的:在`if not (foo.x * 2) + 1 &lt; bar`中,你不会期望`not (foo.x*2) + 1` 表示“恰好为 1 if (foo.x*2) + 1 == 0 else 0”,然后将其与带有“小于”的 bar 进行比较。在某些情况下,涉及“&lt;”的否定语句也比将“&lt;”本身否定为“&gt;=”更具可读性。 (2认同)

Arm*_*ali 13

声称构成语法错误的原因True == not False与运算符优先级有关的答案是错误的。如果是这种情况,表达式2 ** - 1也会产生语法错误,当然事实并非如此。优先级永远不会导致使用运算符来代替操作数。

\n

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

\n
\n

比较 ::= or_expr (comp_operator or_expr)*

\n
\n

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

\n

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

\n
\n

power ::= (await_expr | Primary) ["**" u_expr]

\n
\n

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

\n

  • 参数“_`not`和一元否定具有完全不同的优先级_”是无关紧要的;相关的是“==”和“not”与“**”和“-”相比的优先级差异。坚持将优先级与解析混合会导致 Python 文档自相矛盾,首先将 [运算符优先级] 中的 `**` 置于 `-` 之上(https://docs.python.org/3/reference/expressions.html#运算符优先级)表,然后注意 _[\[5\]](https://docs.python.org/3/reference/expressions.html#id15) 幂运算符 `**` 的绑定不如算术紧密或按位一元运算符…_。 (3认同)
  • 这种说法是虚假的。当然,优先级可以解释 `True == not False` 和 `2 ** -1` 的行为,因为 *`not` 和一元否定具有完全不同的优先级!* 事实上 `or_expr` 不包含 `not_test ` 是*优先级是如何实现的!* (2认同)
  • 在运算符优先级表中,“==”正好位于“not”上方一行,而“**”正好位于一元“-”上方一行。人们怎么可能仍然相信仅凭优先级就可以解释“True == not False”是语法错误,而“2**-1”则不是? (2认同)

unw*_*ind 10

这只是运营商优先权的问题.

尝试:

>>> True == (not False)
True
Run Code Online (Sandbox Code Playgroud)

看看这个运算符优先级表,你会发现==绑定比它更严格not,因此True == not False被解析为(True == not) False显然是一个错误.