False是否保证等于0,True是否保证等于1?

9

可能是重复问题:
在Python中,False == 0 and True == 1是一种实现细节还是语言保证?

我今天注意到以下内容在使用Python 2.6(Cpython)时有效...

>>> a=[100,200]
>>> a[True]
200
>>> a[False]
100

这个能够移植到其他的Python实现吗(例如,True/False是否保证继承自int?True是否保证评估为1而不是其他非零数字?)有没有任何情况下这是有用的?它似乎可以用作三元运算符的另一种形式,但我不知道在那里获得了多少收益...

6
在Python 2.6及之前,True和False只是变量,因此可以这样赋值:True, False = "hello", "world",但它们在Python 3.x中具有适当的保留状态。 - user166390
据我所知,True和False是1和0的标签。 1 == True和0 == False。 因此,它将返回列表中的第0个和第1个项目。 - Gwyn Howell
@gwynhowell:不,TrueFalse是属于bool类型的对象。 - Fred Foo
@gwynhowell 是的,这就是我展示的(至于在列表中返回0和1项),但我想知道它是否被标准保证或者是实现细节…还要注意True和False并不完全等同于1和0(True is 1 -> FalseFalse is 0 -> False)。 - mgilson
@larsmans 是的,这是那个问题的重复。我在搜索中没有找到它。谢谢。 - mgilson
在2.6和2.7中,它们是int。我有时会使用它们来选择正确的执行方式。例如:eval(["y/x", "x/y"][x>y])。但在几乎所有情况下,使用三元运算符更好。 - inspectorG4dget
2个回答

11

这是语言规范的一部分,因此任何 Python 实现应该将布尔类型实现为等同于整数。

布尔值

它们表示 False 和 True 两个真值。表示 False 和 True 值的对象是唯一的布尔对象。布尔类型是普通整数的子类型,布尔值在几乎所有上下文中都像值 0 和 1 一样行为,唯一的例外是在转换为字符串时分别返回字符串 "False" 或 "True"。


4
是的,这是有保证的,但要注意TrueFalse可能会被重新赋值;但这不会影响布尔运算的结果。(感谢Ignacio提供了文档证明)。事实上,在没有三目运算符的时候,这是模拟它的方法之一。现在,如果你想要一个三目运算符,请使用三目运算符。但有些时候,这种结构仍然很有用。例如:
>>> even_odd = [[], []]
>>> for i in range(10):
...     even_odd[i % 2 == 1].append(i)
... 
>>> print even_odd
[[0, 2, 4, 6, 8], [1, 3, 5, 7, 9]]

你也可以使用字典来实现这一点。它具有三元运算符的等效形式...
>>> even, odd = [], []
>>> for i in range(10):
...     (even if i % 2 == 1 else odd).append(i)
... 
>>> even, odd
([1, 3, 5, 7, 9], [0, 2, 4, 6, 8])

但是在这种情况下,我实际上发现列表索引版本更易于阅读。个人见解可能会有所不同。


直接说 even_odd[i % 2].append(i) 不是更容易吗? - thebjorn

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