9

可能的重复:
Python 中的 False == 0 和 True == 1 是实现细节还是由语言保证?

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

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

这是否可移植到其他 python 实现(例如True/False保证从 int 继承?True保证评估为 1 而不是其他非零数?)有什么情况可以使用?好像可以用作另一种形式的三元算子,不过不知道能得到多少……

4

2 回答 2

11

它是语言规范的一部分,因此任何 Python 实现都应该将布尔值实现为等效于整数。

布尔值

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

于 2012-04-21T23:35:28.367 回答
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。

于 2012-04-21T23:36:42.573 回答