您可以使用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
这意味着堆栈在每一步之后都是这样的:
^{pr2}$
对我来说,老实说,它看起来像是Python中的一个bug。也许有一些很好的解释为什么会发生这种情况,但我会向上游报告。
为了以等效的方式重写它,代码可以:
^{3}$
编辑:也许这真的有点奇怪。考虑检查链式不等式的工作原理:3 > 2 > 1 == 3 > 2 and 2 > 1
如果概括为:x op1 y op2 z == x op1 y and y op2 z
这就可以解释这个结果了。在comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "" | "==" | ">=" | "<=" | "<>" | "!="
| "is" ["not"] | ["not"] "in"
is被认为与>一样好的比较,因此应用了多个比较的标准扩展。在
其他的比较现在应该很清楚了。唯一需要的奇怪的新细节是:True == 1,False == 0,所以3 > False在3 > (2 is True)。其他大多数都可以用扩展来解释。例如:5 < 3 is False > 2 is True == False
(5 < 3) and (3 is False) and (False > 2) and (2 is True) == False