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

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

问题描述:

我是测试一些代码片段为什么比较返回一个整数而不是布尔值?

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 (==)。巫婆应该返回一个布尔值,但它看起来它会返回一个整数。任何想法为什么?

编辑:

总之教训:改变的真或假的值不会改变布尔逻辑如何在幕后代表。

+2

在python 3中已经修复,现在'True'和'False'是关键字,你不能给它们分配任何东西。 –

+0

然而,'3 >> True == 1' 'True' –

+0

http://www.python.org/dev/peps/pep-0285/ – namit

在我看来,你的误解是思维像变量一样对待True实际上会改变布尔运算的结果。它没有。默认情况下使用True来重新表示布尔值,但是当你改变它的值时,它会失去这个功能。然而,这并没有改变布尔人如何处理整数的规则。

在Python,boolint的子类,和FalseTrue分别具有01等效值。另外,__eq__()可以返回任何它喜欢的对象;对于内置类型它恰好如此,它返回bool实例。

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

int(True)1,所以你有1-1这就是0

此外,-1是一个布尔True(它不是一个“Falsey”值),从而期待,作为一个答案不会是准确或者:

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

>>> 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

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

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

在Python 3中,通过将名称TrueFalse变为关键字来回避此问题,因此它们不能被重新绑定到新值。