【问题标题】:Associativity of comparison operators in PythonPython中比较运算符的关联性
【发布时间】:2015-09-12 07:10:18
【问题描述】:

Python 中比较运算符的结合性是什么?三个比较很简单,但除此之外,我不确定它是如何做到的。它们似乎不是右联想或左联想。

例如:

>>> 7410 >= 8690 <= -4538 < 9319 > -7092        
False    
>>> (((7410 >= 8690) <= -4538) < 9319) > -7092 
True

所以,不是左结合。

>>> 81037572 > -2025 < -4722 < 6493           
False
>>> (81037572 > (-2025 < (-4722 < 6493)))     
True

所以它也不是右结合的。

我已经看到一些地方他们被“链接”了,但是如果有四个或更多的比较,它是如何工作的呢?

【问题讨论】:

    标签: python comparison comparison-operators associativity


    【解决方案1】:

    链式比较用and展开,所以:

    a <= b <= c
    

    变成:

    a <= b and b <= c
    

    (不过,b 只计算一次)。这在language reference on comparisons 中有解释。

    请注意,惰性求值意味着如果a &gt; b,则结果为False,并且b 永远不会与c 进行比较。

    带括号的版本完全不同; a &lt;= (b &lt;= c) 将评估 b &lt;= c 然后将 a 与结果进行比较,and 根本不涉及,因此比较结果以确定关联性没有意义。

    【讨论】:

      【解决方案2】:

      python 短路布尔测试从左到右:

      7410>=8690<=-4538<9319>-7092        -> False
      

      7410&gt;=8690False。就是这样。其余测试未执行。

      注意

      True == 1
      False == 0
      

      都是True,当您将布尔值与整数进行比较时应用。所以当你用括号括住语句时,你会强制 python 做所有的测试;详细:

      (((7410>=8690)<=-4538)<9319)>-7092
            False   <=-4538
                  False     <9319
                          True  >-7092
                               True
      

      【讨论】:

        【解决方案3】:

        您在使用类型时出错,当您编写81037572&gt;-2025 时,系统会将其视为TrueFalse,并将其与10 相关联。因此,它会为您提供与这些二进制数的比较。

        【讨论】:

        • 我意识到它们返回布尔值。 Python 在比较期间使用布尔值作为整数。因此,例如,12>3>4>5 返回假。我知道它不会返回数学上正确的结果。它们只是例子,我只是在问它们是如何被解释的。按什么顺序。
        • 据我所知是从右到左。由于0 &lt; 3 &lt; 2returns False
        • 如果是这样,那么 02 为真。
        • 0 &lt;= 1 &gt; 2 被评估为0 &lt;= 1 and 1 &gt; 2 --> True and False --> False
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-17
        • 1970-01-01
        • 2016-11-20
        • 2021-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多