为什么bool是int的一个子类?

当通过python-memcached在memcached中存储bool时,我注意到它是作为整数返回的。 检查库的代码告诉我,有一个地方isinstance(val, int)来标记值作为一个整数。

所以我testing了它在Python shell中,注意到以下几点:

 >>> isinstance(True, int) True >>> issubclass(bool, int) True 

但为什么boolint一个子类呢?

这是有道理的,因为一个布尔基本上是一个int可以只需要两个值,但它比实际的整数(没有algorithm,只有一个存储空间)需要更less的操作/空间….

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

这是完全合乎逻辑的,如果你在booltypes被添加到python的时候(2.2或2.3左右)。

在引入实际的布尔型之前,0和1是真值的官方表示,类似于C89。 为了避免不必要地破坏非理想的工作代码,新的booltypes需要像0和1一样工作。这不仅仅是真值,而是所有的整数操作。 没有人会build议在数字上下文中使用布尔结果,大多数人也不build议testing相等性来确定真值,没有人想要知道现有的代码是多less。 因此,决定将True和False伪装成1和0。 这仅仅是语言演变的历史人造物。

信用去dman13这个很好的解释。

见PEP 285 – 添加一个布尔types 。 相关通道:

6)应该布尔从intinheritance?

=>是的。

在一个理想的世界里,布尔可能会更好地实现为一个单独的整数types,知道如何执行混合模式算术。 但是,从intinheritancebool可以大大简化实现(部分原因是调用PyInt_Check()的所有C代码都将继续工作 – 这将为int的子类返回true)。