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 (==). Witch 应该返回一个布尔值,但它似乎返回一个整数。任何想法为什么?

编辑:

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

4

5 回答 5

4

在 Python 中,bool是 的子类intFalse和分别具有和True的等价值。此外,可以返回它喜欢的任何对象;碰巧的是,对于内置类型,它返回实例。01__eq__()bool

于 2013-01-15T06:22:11.090 回答
3

在我看来,您的误解是认为True像变量一样对待实际上会改变布尔运算的结果。它没有。 True默认情况下用于表示布尔值,但是当您更改其值时它会失去该功能。但是,这不会改变关于如何处理整数的布尔值的规则。

于 2013-01-15T06:26:03.773 回答
3

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

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

在 Python 3 中,通过将名称TrueFalse关键字设为关键字来回避这个问题,因此它们无法重新生成新值。

于 2013-01-15T06:33:59.747 回答
2
>>> True = 2

在这里你分配2True. 所以现在True在模块的范围内实际上是2

>>> print(True)
2

1 == 1TrueTrue等于。_1

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

你可以问为什么不是2,如上所述。好吧,变量在模块的范围内True等于,并且只是将引用(标签)返回给 real 。一个实数等于,所以等于。2(1==1)True1==1True11 - (1 == 1)0


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

这里1 == 1再次返回对 real 的引用True。但是True表达式的第一部分来自模块的范围,所以它实际上是2. 所以这个表达式实际上2 == (True)等于False

于 2013-01-15T06:28:16.097 回答
1

当您从布尔值中减去和整数时,将使用其整数表示;因为它们是 的子类int

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

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

>>> -1 == True
False
>>> -1 == False
False
>>> bool(-1)
True
于 2013-01-15T06:22:43.303 回答