我正在测试一些代码
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的值不会改变布尔逻辑在场景后面的表示方式。
答案 0 :(得分:3)
在Python中,bool
是int
的子类,False
和True
的等效值分别为0
和1
。此外,__eq__()
可以返回它喜欢的任何对象;它就是这样,对于内置类型,它会返回bool
个实例。
答案 1 :(得分:3)
在我看来,你的误解在于认为将True
视为一个变量实际上会改变布尔运算的结果。它没有。默认情况下,True
用于表示布尔真值,但是当您更改其值时,它会丢失该功能。但是,这并没有改变关于整数的布尔值的处理规则。
答案 2 :(得分: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
设置为关键字来回避此问题,因此它们无法反弹到新值。
答案 3 :(得分:2)
>>> 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
。
答案 4 :(得分:1)
当你从布尔值减去整数时,使用它的整数表示;因为它们是int
的子类。
int(True)
为1
,因此1-1
为0
。
此外,-1
是一个布尔True
(它不是一个“Falsey”值)所以期待作为一个答案也不准确:
>>> -1 == True
False
>>> -1 == False
False
>>> bool(-1)
True