编程语言
首页 > 编程语言> > Python中的不等式和括号

Python中的不等式和括号

作者:互联网

所以在python中,可以很容易地检查真值条件,并且用括号它可以优先考虑真实条件的顺序,例如:这些很容易理解:

>>> 3 > 2
True
>>> (3 > 2) is True
True

但是这些意味着什么,我无法理解为什么它们返回False / True的逻辑:

>>> 3 > 2 is True
False
>>> 3 > (2 is True)
True
>>> 5 < 3 is False > 2 is True
False
>>> 5 < 3 is False is True > 2 is True
False
>>> 3 < 5 is True is True > 2 is True
False
>>> 3 < 5 is True is True > 2 is True is not False is True
False
>>> 3 < 5 is True is (True > 2 is True is not False) is True
False
>>> 3 < 5 is True is (True > (2 is True) is not False) is True
False
>>> (3 < 5 is True is True) > 2 is (True is not False is True)
False

我知道这些不是pythonic条件,但我应该如何理解它们?它还是从左到右?

或者确实是真的或/和假是否需要总统?

解决方法:

您可以使用dis模块分析每个案例,以确切了解发生了什么.例如:

In [1]: import dis
In [2]: def test():
   ...:     return 3 > 2 is True
   ...: 
In [3]: dis.dis(test)
  2           0 LOAD_CONST               1 (3)
              3 LOAD_CONST               2 (2)
              6 DUP_TOP             
              7 ROT_THREE           
              8 COMPARE_OP               4 (>)
             11 JUMP_IF_FALSE_OR_POP    21
             14 LOAD_GLOBAL              0 (True)
             17 COMPARE_OP               8 (is)
             20 RETURN_VALUE        
        >>   21 ROT_TWO             
             22 POP_TOP             
             23 RETURN_VALUE

这意味着在每个步骤之后堆栈看起来像这样:

 0: 3
 3: 3 2
 6: 3 2 2
 7: 2 3 2
 8: 2 True
11: 2
14: 2 True
17: False (comparison was: "2 is True")
20: (False is returned)

老实说,对我来说,它看起来像Python中的一个错误.也许对于为什么会发生这种情况有一些很好的解释,但我会向上游报告.

只是以相同的方式重写它,代码执行:

if 3 > 2:
    if 2 is True:
        return True
return False

编辑:也许它实际上会产生一些奇怪的感觉.考虑检查链式不等式的工作原理:

3 > 2 > 1  ==  3 > 2 and 2 > 1

如果它概括为:

x op1 y op2 z == x op1 y and y op2 z

这将解释结果.

Edit2:这实际上与文档匹配.看看链式比较:https://docs.python.org/2/reference/expressions.html#not-in

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
                   | "is" ["not"] | ["not"] "in"

被认为与>一样好,因此应用了多重比较的标准扩展.

其他比较现在应该清楚.唯一需要的奇怪的新细节是:True == 1,False == 0,所以3> 3中的错误> (2是真的).其他大多数都可以用扩展来解释.例如:

5  <     3     is       False       >     2     is True  == False
(5 < 3) and (3 is False) and (False > 2) and (2 is True) == False

标签:python,if-statement,condition,inequality
来源: https://codeday.me/bug/20190528/1168428.html