我的解决方案实际上需要xor
,但在思考时,我开始怀疑上面的问题。 True == True != False
是什么意思?
查看文档我认为它是True == True and True != False
,但我想要一个更通用和确定的方法。如何快速获得此类代码的字节码可读形式。有没有比字节码和文档更容易找到的方法?
答案 0 :(得分:9)
它被称为operator chaining。只要您的A op1 B op2 C
表达式与op1
和op2
进行比较,就会将其“翻译”为A op1 B and B op2 C
。
(实际上它只评估B
一次)。
注意:比较运算符包括in
,not in
,is
,is not
! (例如a is b is not None
表示a is b and b is not None
)。
如果您想查看字节码,可以使用dis
模块:
In [1]: import dis
In [2]: dis.dis(lambda: True == True != False)
1 0 LOAD_CONST 1 (True)
3 LOAD_CONST 1 (True)
6 DUP_TOP
7 ROT_THREE
8 COMPARE_OP 2 (==)
11 JUMP_IF_FALSE_OR_POP 21
14 LOAD_CONST 2 (False)
17 COMPARE_OP 3 (!=)
20 RETURN_VALUE
>> 21 ROT_TWO
22 POP_TOP
23 RETURN_VALUE
如果您阅读字节码,您可以理解它执行操作符链接。
鉴于表达式为True == True != False
,其被“解释”为True == True and True != False
,它首先通过{为第一个运算符加载两个 True
常量{1}}字节码。 LOAD_CONST
复制堆栈顶部(这样可以避免重新评估DUP_TOP
进行第二次比较)。
它执行第一次比较(True
)如果它只是对字节码21是假的,否则它会弹出堆栈的顶部(COMPARE_OP
)。然后它执行第二次比较。
要回答您的一般问题,了解python某些功能的最快方法是使用文档的quicksearch页面。 我还建议您阅读Python's tutorial以获得该语言的一般介绍。
我想补充一点,因为python提供了一个交互式环境,所以通常更容易理解一些代码如何在解释器中编写它并观察结果。几乎所有内置类型都有通过文档字符串提供的文档,因此执行JUMP_IF_FALSE_OR_POP
应该会为您提供大量信息。
特别是IPython
提供了一个增强的交互式解释器,具有更加用户友好的帮助消息/错误格式等。)
答案 1 :(得分:4)
在大多数语言中,a == b != c
解析为(a == b) != c
。
因此,您期望True == True != False
与(True == True) != False
相同,后者评估为True != False
,评估为True
。
Python具有不同的含义,可以在这里看到:
>>> True != False != False
False
>>> (True != False) != False
True
在Python中,a == b != c
相当于(a == b) and (b != c)
。
这意味着True == True != False
相当于(True == True) and (True != False)
,其评估为True and True
,其评估结果为True
。
巧合的是,这两种意义(Python和其他语言的意思)在这里给出了相同的结果,但是应该谨慎。