【问题标题】:python operator precedence of in and comparisonin和比较的python运算符优先级
【发布时间】:2021-09-02 01:02:29
【问题描述】:

以下比较产生True

>>> '1' in '11'
True
>>> ('1' in '11') == True
True

如果使用括号,我会得到一个 TypeError:

>>> '1' in ('11' == True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument of type 'bool' is not iterable

那么我如何得到不带括号的False

>>> '1' in '11' == True
False

【问题讨论】:

    标签: python


    【解决方案1】:

    Python 手册说in== 等于precedence。因此,默认情况下它们是从左到右评估的,但也需要考虑链接。您在上面的表达式 ('1' in '11' == True) 实际上 被评估为...

    ('1' in '11') and ('11' == True)
    

    当然是False。如果您不知道什么是链接,那么它可以让您执行类似...

    if 0 < a < 1:
    

    在 Python 中,这意味着您所期望的(“a 大于 0 但小于 1”)。

    【讨论】:

      【解决方案2】:

      它与优先级无关。在 Python 关系运算符链中,包含被认为是关系运算符。因此:

      '1' in '11' == True
      

      等同于:

      ('1' in '11') and ('11' == True)
      

      这是错误的,因为True 不等于“11”。

      【讨论】:

        【解决方案3】:

        Chaining 允许你写成x &lt; y &lt; z,意思是x &lt; y and y &lt; z。看看这个互动:

        >>> (False == True) == False
        True
        >>> False == (True == False)
        True
        >>> False == True == False
        False
        >>>
        

        所以在你的例子中,'1' in '11' == True 等价于('1' in '11') and ('11' == True)

        【讨论】:

          【解决方案4】:

          这里发生了什么?

          '1' in '11' == True  ==>  False
          

          是一样的:

          '1' in ('11' == True)
          

          但是

          ('11' == True) ==> False
          

          '1' in False
          

          未定义。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-08-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多