当通过python-memcached在memcached中存储bool时,我注意到它以整数形式返回.检查库的代码向我显示有一个地方isinstance(val, int)
被检查以将值标记为整数.
所以我在python shell中测试了它并注意到以下内容:
>>> isinstance(True, int) True >>> issubclass(bool, int) True
但为什么究竟是bool
一个子类int
呢?
它有点意义,因为布尔值基本上是一个int,它可以只取两个值,但它需要比实际整数少得多的操作/空间(没有算术,只有一点存储空间)....
来自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.
参见PEP 285 - 添加bool类型.相关段落:
6)bool应该继承自int吗?
=>是的.
在理想的世界中,bool可能更好地实现为一个知道如何执行混合模式算术的单独整数类型.但是,从int继承bool可以极大地简化实现(部分原因是所有调用PyInt_Check()的C代码都将继续工作 - 这对于int的子类返回true.