为什么bool是int的子类?

Thi*_*ter 79 python boolean

当通过python-memcached在memcached中存储bool时,我注意到它以整数形式返回.检查库的代码向我显示有一个地方isinstance(val, int)被检查以将值标记为整数.

所以我在python shell中测试了它并注意到以下内容:

>>> isinstance(True, int)
True
>>> issubclass(bool, int)
True
Run Code Online (Sandbox Code Playgroud)

但为什么究竟是bool一个子类int呢?

它有点意义,因为布尔值基本上是一个int,它可以只取两个值,但它需要比实际整数少得多的操作/空间(没有算术,只有一点存储空间)....

Pol*_*ial 93

来自http://www.peterbe.com/plog/bool-is-int的评论

这是完全合乎逻辑的,如果你在bothon类型被添加到python时(大概2.2或2.3左右).

在引入实际bool类型之前,0和1是真值的官方表示,类似于C89.为了避免不必要地破坏非理想但工作的代码,新的bool类型需要像0和1一样工作.这不仅仅是真值,而是所有积分运算.没有人会建议在数值上下文中使用布尔结果,大多数人也不建议测试相等性来确定真值,没有人想要找出现有代码的硬道路.因此,将True和False伪装成1和0的决定.这仅仅是语言演变的历史人工制品.

对于这个很好的解释,可以归功于dman13.

  • 有趣的是,这是我在StackExchange上最高的投票答案,尽管我一生都没有写过一行Python! (46认同)
  • (不再是真的 - Python很有趣!) (36认同)
  • 请注意,这可能在历史上是正确的,但在惯用的情况下,您会看到很多`sum(值的值为[f(值)])```f(x)`是某种过滤函数,你需要看多少值通过过滤器. (2认同)
  • 就我个人而言,我宁愿写出“ sum(1,如果f(value)表示值的值)”,但实际上我已经看到受人尊敬的人主张对布尔值进行数值运算。 (2认同)

Ste*_*ski 25

参见PEP 285 - 添加bool类型.相关段落:

6)bool应该继承自int吗?

=>是的.

在理想的世界中,bool可能更好地实现为一个知道如何执行混合模式算术的单独整数类型.但是,从int继承bool可以极大地简化实现(部分原因是所有调用PyInt_Check()的C代码都将继续工作 - 这对于int的子类返回true.