为什么比较返回一个整数而不是布尔值?
我是测试一些代码片段为什么比较返回一个整数而不是布尔值?
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 (==)
。巫婆应该返回一个布尔值,但它看起来它会返回一个整数。任何想法为什么?
编辑:
总之教训:改变的真或假的值不会改变布尔逻辑如何在幕后代表。
在我看来,你的误解是思维像变量一样对待True
实际上会改变布尔运算的结果。它没有。默认情况下使用True
来重新表示布尔值,但是当你改变它的值时,它会失去这个功能。然而,这并没有改变布尔人如何处理整数的规则。
在Python,bool
是int
的子类,和False
和True
分别具有0
和1
等效值。另外,__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 == 1
是True
。 True
是equal 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)
,而不是True
或False
的值。在Python 2中,True
和False
只是分别绑定到bool(1)
和bool(0)
的名称。如果将名称True
重新命名为不同的值(例如2
),它不会更改比较中的返回值,该比较仍为bool(1)
。
在Python 3中,通过将名称True
和False
变为关键字来回避此问题,因此它们不能被重新绑定到新值。
在python 3中已经修复,现在'True'和'False'是关键字,你不能给它们分配任何东西。 –
然而,'3 >> True == 1' 'True' –
http://www.python.org/dev/peps/pep-0285/ – namit