是否保证False“为0”且True“为1”?

时间:2012-04-21 23:27:18

标签: python boolean

  

可能重复:
  Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?

我今天注意到以下工作使用python 2.6(Cpython)...

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

这是否可移植到其他python实现(例如True / False是否保证从int继承?True是否保证计算为1而不是其他非零数字? )有什么情况会有用吗?它似乎可以用作三元运算符的另一种形式,但我不知道在那里获得了多少......

2 个答案:

答案 0 :(得分:11)

它是part of the language specification,所以任何Python实现应该实现与整数等效的布尔值。

  

布尔

     
    

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

  

答案 1 :(得分: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])

但实际上我发现列表索引版本更容易阅读,至少在这种情况下。 YYMV。