是否有合法使用list [True],在Python中列出[False]?

时间:2016-06-30 08:17:05

标签: python boolean

由于TrueFalseint的实例,因此以下内容在Python中有效:

>>> l = [0, 1, 2]
>>> l[False]
0
>>> l[True]
1

我明白为什么会这样。但是,我发现这种行为有点出乎意料,并且可能导致难以调试的错误。它肯定咬过我几次。

有人会想到使用TrueFalse合法使用索引列表吗?

3 个答案:

答案 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是一个有效的索引参数:这只是为了一致性,而boolint的子类,在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()将继续工作 - 这将返回true    int)的子类。另外,我认为这是正确的    可替代性:需要int的代码可以提供bool    它的行为与01相同。需要的代码    给bool时,int可能无效;例如,3& 4    是0,但当被认为是真理时,3和4都是真的    值。

  

由于bool继承自intTrue+1有效且等于2,并且   等等。 这对于向后兼容非常重要:因为   比较等等当前返回整数值,没有   告诉我们使用现有应用程序的方法   值。

  

由于向后兼容性,bool类型缺少很多    有些人希望看到的属性。例如,算术    允许使用一个或两个bool参数进行操作    假为0,True为1.此外,bool可用作序列    索引。

     

我不认为这是一个问题,我不想进化    这方面的语言也是。我不相信    对“布尔性”的更严格解释使语言成为任何一种    更加清晰。

<强>摘要

  • 向后兼容性:有大量代码已使用int s 01代表FalseTrue,其中一些代码使用了这些代码数值计算中的值。
  • 拥有“非教科书”bool类型
  • 并不是什么大问题
  • Python社区中有很多人想要这些功能
  • BDFL这么说。

答案 2 :(得分:4)

通常有更好的方法,但布尔索引确实有其用途。当我想将布尔结果转换为更易于阅读的东西时,我已经使用过它们了:

test_result = run_test()
log.info("The test %s." % ('Failed', 'Passed')[test_result])