由于True
和False
是int
的实例,因此以下内容在Python中有效:
>>> l = [0, 1, 2]
>>> l[False]
0
>>> l[True]
1
我明白为什么会这样。但是,我发现这种行为有点出乎意料,并且可能导致难以调试的错误。它肯定咬过我几次。
有人会想到使用True
或False
合法使用索引列表吗?
答案 0 :(得分:60)
过去,有些人利用这种行为来制造一个穷人的conditional expression:
['foo', 'bar'][eggs > 5] # produces 'bar' when eggs is 6 or higher, 'foo' otherwise
然而,在Python 2.5中添加了proper conditional expression语言,这是非常不赞成的,因为你说的原因:依赖布尔值作为整数的子类是太神奇了#39;并且对于维护者来说是不可读的。
所以,除非你是高尔夫代码(故意生成非常紧凑和模糊的代码),否则使用
'bar' if eggs > 5 else 'foo'
相反,它具有额外的优势,即它选择的两个表达式是 lazily 评估的;如果eggs > 5
为false,则永远不会执行if
之前的表达式。
答案 1 :(得分:35)
如果您感到困惑,为什么bool
是一个有效的索引参数:这只是为了一致性,而bool
是int
的子类,在Python中,是一种数字类型。
如果您首先询问为什么bool
是数字类型,那么您必须明白旧版本的Python中没有bool
,并且人们使用int
s代替。
我将添加一些历史性论点。首先,在Guido van Rossum(又名BDFL)博文中简要介绍了bool
在python中的添加:The History of Python: The history of bool
, True
and False
。该类型是通过PEP 285添加的。
PEP包含用于此决策的实际基本原理。我将引用下面PEP的一些部分。
4)我们是否应该努力消除对布尔的非布尔运算 在未来,通过适当的警告,例如
True+1
最终会(在Python 3000中)是非法的吗?=>否。
有一个小但有声音的少数人喜欢看 “教科书”bool不支持算术运算 所有,但大多数评论家都认同bools应该永远 允许算术运算。
6)
bool
是否应继承int
?=>是。
在理想的世界中,
bool
可能更好地实现为 单独的整数类型,知道如何执行混合模式 算术。但是,从bool
继承int
可以简化 实现极大(部分原因是所有调用的C代码)PyInt_Check()
将继续工作 - 这将返回trueint
)的子类。另外,我认为这是正确的 可替代性:需要int
的代码可以提供bool
它的行为与0
或1
相同。需要的代码 给bool
时,int
可能无效;例如,3& 4 是0,但当被认为是真理时,3和4都是真的 值。
由于
bool
继承自int
,True+1
有效且等于2
,并且 等等。 这对于向后兼容非常重要:因为 比较等等当前返回整数值,没有 告诉我们使用现有应用程序的方法 值。
由于向后兼容性,bool类型缺少很多 有些人希望看到的属性。例如,算术 允许使用一个或两个bool参数进行操作 假为0,True为1.此外,bool可用作序列 索引。
我不认为这是一个问题,我不想进化 这方面的语言也是。我不相信 对“布尔性”的更严格解释使语言成为任何一种 更加清晰。强>
<强>摘要强>:
int
s 0
和1
代表False
和True
,其中一些代码使用了这些代码数值计算中的值。bool
类型答案 2 :(得分:4)
通常有更好的方法,但布尔索引确实有其用途。当我想将布尔结果转换为更易于阅读的东西时,我已经使用过它们了:
test_result = run_test()
log.info("The test %s." % ('Failed', 'Passed')[test_result])