gpt4 book ai didi

python - Python 中的不等式和括号

转载 作者:太空狗 更新时间:2023-10-30 02:29:09 24 4
gpt4 key购买 nike

所以在 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 条件,但我应该如何理解它们?还是从左到右?

还是 is True 或/和 is False 担任总统?

最佳答案

您可以使用 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"

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

其他比较现在应该很清楚了。唯一需要的奇怪新细节是:True == 1False == 0,所以 3 > False in 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 - Python 中的不等式和括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33948574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com