【问题标题】:Why is 'True == not False' a syntax error in Python?为什么'True == not False'是Python中的语法错误?
【发布时间】:2011-08-31 07:32: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 == &lt;x&gt; 是一个有效的语法,只要&lt;x&gt; 是一个具有有效语法的表达式。

【问题讨论】:

  • 请注意,“True is not False”与“True is (not False)”相同。 “is not”是一个独特的运算符,表示“不等于”,而“True is (not False)”读作“True 与 False 的布尔否定相同”。只是一个评论,因为你的例子似乎,好像你会假设,这两者都是一样的。
  • True == not 是实际的语法错误,之后的任何内容都无关紧要。
  • 并且作为记录,对于 any 比较运算符加上 not无论比较的类型如何,这都会失败。 True &lt; not False3 &lt;= not 2'Foo' &gt; not 'False'3.3 &gt;= not 4.5{} is not not []set() == not Noneslice() != not lambda: x all 引发相同的语法错误。这不仅限于== not 和布尔值。

标签: python boolean comparison-operators


【解决方案1】:

它与operator precedence in Python 相关(解释器认为您是在比较真与否,因为== 的优先级高于not)。您需要一些括号来阐明操作顺序:

True == (not False)

一般来说,您不能在没有括号的比较右侧使用not。但是,我想不出你需要在比较右侧使用not 的情况。

【讨论】:

  • 运算符优先级是有原因的,还是只是一个愚蠢的“功能”?
  • 哇;这很有趣。我想不出我知道的任何其他语言的否定优先级如此低,当然不低于平等!
  • Logical 反转在 Python 中的优先级较低。相比之下,算术求反(一元-)和按位求反(~)都具有相当高的优先级。
  • 当然,就像 Python 中的几乎所有内容一样,它非常有意义,因为 == not 看起来很奇怪,并且在大多数情况下都可以用 != 替换。
  • @JimClay 原因可能是与其他比较运算符的一致性,这种优先级在 imo 中非常有意义:在 if not (foo.x * 2) + 1 &lt; bar 中,您不会期望 not (foo.x*2) + 1 表示“1 正好 if (foo.x *2) + 1 == 0 else 0",然后将其与“小于”的 bar 进行比较。在某些情况下,涉及“=”更具可读性。
【解决方案2】:

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

>>> True == (not False)
True

查看this table of operator precedences,您会发现== 的绑定比not 更紧密,因此True == not False 被解析为(True == not) False,这显然是一个错误。

【讨论】:

    【解决方案3】:

    声称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_expru_exprpower...,但没有 not_test .

    相比之下,优先级相似构造2 ** - 1符合幂规则

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

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

    【讨论】:

    • 可能值得一提的是not 确实适合这里:inversion 要么是'not',后跟另一个inversion,要么是comparisoninversionconjunction 的构建块,它是 disjunction 的构建块,您基本上可以将其视为 expressions 的三种基本类型之一(另外两种是条件表达式和 lambda 表达式)。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-03
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 1970-01-01
        • 2022-07-16
        • 2011-04-28
        • 2018-06-17
        相关资源
        最近更新 更多