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

5

我正在测试一些代码

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或False的值并不会改变其背后表示的布尔逻辑。


2
在Python 3中,这个问题已经被解决了,TrueFalse现在是关键字,你不能给它们赋值。 - Ashwini Chaudhary
然而,3>> True == 1 True - Ignacio Vazquez-Abrams
http://www.python.org/dev/peps/pep-0285/ - namit
1
顺便提一下,这里的实际教训是名称与值无关。如果给定 ten=42,你会期望 9+1 返回 42 吗? - georg
@thg435 不,我会期望 ten == (9 + 1) ;) - razpeitia
5个回答

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

3

我认为你的误解在于认为将 True 当作变量处理会改变布尔运算的结果,但实际上并不会。 True 默认用来表示布尔真值,但一旦更改其值,它就失去了这种功能。然而,这并不会影响布尔值与整数的处理规则。


3
我认为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更改为关键字来避免此问题,因此它们不能重新绑定到新的值。

2
>>> True = 2

在这里你将True赋值为2。所以现在模块作用域中的True实际上是2

>>> print(True)
2

1 == 1TrueTrue 等于 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

1

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

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接