我今天注意到以下内容在使用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
True
/False
是否保证继承自int?True
是否保证评估为1而不是其他非零数字?)有没有任何情况下这是有用的?它似乎可以用作三元运算符的另一种形式,但我不知道在那里获得了多少收益...这是语言规范的一部分,因此任何 Python 实现应该将布尔类型实现为等同于整数。
布尔值
它们表示 False 和 True 两个真值。表示 False 和 True 值的对象是唯一的布尔对象。布尔类型是普通整数的子类型,布尔值在几乎所有上下文中都像值 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])
但是在这种情况下,我实际上发现列表索引版本更易于阅读。个人见解可能会有所不同。
even_odd[i % 2].append(i)
不是更容易吗? - thebjorn
True, False = "hello", "world"
,但它们在Python 3.x中具有适当的保留状态。 - user166390True
和False
是属于bool
类型的对象。 - Fred FooTrue is 1
->False
,False is 0
->False
)。 - mgilsonint
。我有时会使用它们来选择正确的执行方式。例如:eval(["y/x", "x/y"][x>y])。但在几乎所有情况下,使用三元运算符更好。 - inspectorG4dget