我今天注意到以下使用python 2.6(Cpython)的作品......
>>> a=[100,200]
>>> a[True]
200
>>> a[False]
100
这是否可移植到其他 python 实现(例如True
/False
保证从 int 继承?True
保证评估为 1 而不是其他非零数?)有什么情况可以使用?好像可以用作另一种形式的三元算子,不过不知道能得到多少……
我今天注意到以下使用python 2.6(Cpython)的作品......
>>> a=[100,200]
>>> a[True]
200
>>> a[False]
100
这是否可移植到其他 python 实现(例如True
/False
保证从 int 继承?True
保证评估为 1 而不是其他非零数?)有什么情况可以使用?好像可以用作另一种形式的三元算子,不过不知道能得到多少……
它是语言规范的一部分,因此任何 Python 实现都应该将布尔值实现为等效于整数。
布尔值
这些代表真值 False 和 True。表示值 False 和 True 的两个对象是唯一的布尔对象。Boolean 类型是纯整数的子类型,在几乎所有上下文中,Boolean 值的行为分别类似于值 0 和 1,例外情况是当转换为字符串时,分别返回字符串
"False"
或。"True"
是的——这是有保证的——但需要注意的是True
,False
可能会被重新分配;但这不会影响布尔运算的结果。(感谢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。