为什么比较返回整数而不是布尔值?

时间:2013-01-15 06:17:39

标签: python

我正在测试一些代码

True = 2
print 1 - (1 == 1)
print True == (1 == 1)

然后我在期待:

-1
True

但我得到了这个:

0
False

所以,我做了任何python程序员会做的事情:反汇编它。

def f():
    True = 2
    print 1 - (1 == 1)
    print True == (1 == 1)

2           0 LOAD_CONST               1 (2)
            3 STORE_FAST               0 (True)

3           6 LOAD_CONST               2 (1)
            9 LOAD_CONST               2 (1)
           12 LOAD_CONST               2 (1)
           15 COMPARE_OP               2 (==)
           18 BINARY_SUBTRACT     
           19 PRINT_ITEM          
           20 PRINT_NEWLINE       

4          21 LOAD_FAST                0 (True)
           24 LOAD_CONST               2 (1)
           27 LOAD_CONST               2 (1)
           30 COMPARE_OP               2 (==)
           33 COMPARE_OP               2 (==)
           36 PRINT_ITEM          
           37 PRINT_NEWLINE       
           38 LOAD_CONST               0 (None)
           41 RETURN_VALUE        

然后有点清楚,正在使用COMPARE_OP (==)。 Witch应该返回一个布尔值,但它似乎返回一个整数。有什么想法吗?

修改

简而言之,我们吸取的教训是:更改True或False的值不会改变布尔逻辑在场景后面的表示方式。

5 个答案:

答案 0 :(得分:3)

在Python中,boolint的子类,FalseTrue的等效值分别为01 。此外,__eq__()可以返回它喜欢的任何对象;它就是这样,对于内置类型,它会返回bool个实例。

答案 1 :(得分:3)

在我看来,你的误解在于认为将True视为一个变量实际上会改变布尔运算的结果。它没有。默认情况下,True用于表示布尔真值,但是当您更改其值时,它会丢失该功能。但是,这并没有改变关于整数的布尔值的处理规则。

答案 2 :(得分:3)

我认为Ashwini Chaudhary对这个问题的评论是理解为什么事情没有按照你期望的方式发挥作用的关键。

Python中的布尔运算符通常返回bool(1)bool(0),而不是TrueFalse的值。在Python 2中,TrueFalse只是分别绑定到bool(1)bool(0)的名称。如果您将名称True重新绑定为其他值(例如2),则不会更改比较的返回值,该值仍为bool(1)

在Python 3中,通过将名称TrueFalse设置为关键字来回避此问题,因此它们无法反弹到新值。

答案 3 :(得分:2)

>>> True = 2

您可以在此2指定True。所以现在模块范围内的True实际上是2

>>> print(True)
2

1 == 1TrueTrueequal to 1

>>> 1 - (1 == 1)
0

你可以问上帝为什么不是2,如上所述。好吧,True变量在模块范围内等于2,而(1==1)只是将引用(标记)返回到真实True。因此1==1是真实True,等于1,因此1 - (1 == 1)等于0


>>> print True == (1 == 1)
False

此处1 == 1再次返回对真实True的引用。但是表达式第一部分中的True来自模块的范围,因此它实际上是2。因此,此表达式实际上是2 == (True),等于False

答案 4 :(得分:1)

当你从布尔值减去整数时,使用它的整数表示;因为它们是int的子类。

int(True)1,因此1-10

此外,-1是一个布尔True(它不是一个“Falsey”值)所以期待作为一个答案也不准确:

>>> -1 == True
False
>>> -1 == False
False
>>> bool(-1)
True