True == True!= Python中的False是什么意思?如何查找?

时间:2013-08-30 08:35:18

标签: python bytecode operator-precedence

我的解决方案实际上需要xor,但在思考时,我开始怀疑上面的问题。 True == True != False是什么意思?

查看文档我认为它是True == True and True != False,但我想要一个更通用和确定的方法。如何快速获得此类代码的字节码可读形式。有没有比字节码和文档更容易找到的方法?

2 个答案:

答案 0 :(得分:9)

它被称为operator chaining。只要您的A op1 B op2 C表达式与op1op2进行比较,就会将其“翻译”为A op1 B and B op2 C。 (实际上它只评估B一次)。

注意:比较运算符包括innot inisis 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和其他语言的意思)在这里给出了相同的结果,但是应该谨慎。

相关问题