为什么bool是int的子类?


84

通过python-memcached将布尔存储在memcached中时,我注意到它以整数形式返回。检查库中的代码后,我发现有一个地方isinstance(val, int)可以将值标记为整数。

因此,我在python shell中对其进行了测试,并注意到以下内容:

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

但是,为什么确切地是bool的子类int呢?

这是有道理的,因为布尔值基本上是一个int,它可以只接受两个值,但比实际整数(不需要算术,只需要一点存储空间)就需要更少的操作/空间。



1
值得注意的是,由于在Python中,所有东西都是一个对象,加上开销,所以尝试通过bool减小s来节省空间几乎没有意义。如果您关心内存的使用,那么您将使用另一种语言。
kindall 2011年

Answers:


101

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

如果将布尔类型添加到python时(大约在2.2或2.3左右),那么这是合乎逻辑的。

在引入实际布尔类型之前,0和1是真值的正式表示形式,类似于C89。为避免不必要地破坏非理想但有效的代码,新的布尔类型必须像0和1一样工作。这不仅限于真值,还包括所有积分运算。没有人会建议在数字上下文中使用布尔结果,也没有大多数人会建议测试相等性以确定真值,没有人想找出这种方式来确定现有代码的难度。因此,决定将True和False假装分别设为1和0。这仅仅是语言进化的历史产物。

感谢dman13提供这个不错的解释。


2
请注意,从历史上看这可能是正确的,但习惯上您会sum([f(value) for value in values])f(x)某种程度上看到某种过滤器功能,并且需要查看有多少个值通过过滤器。
亚当·斯密

2
我个人更愿意写sum(1 for value in values if f(value)),但实际上我看到受人尊敬的人主张对布尔值进行数字运算。
Marius Gedminas

28

请参阅PEP 285-添加布尔类型。相关段落:

6)布尔应该从int继承吗?

=>是的。

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


0

也可以help用来Bool在Console中检查的值:

帮助(真)

help(True)
Help on bool object:
class bool(int)
 |  bool(x) -> bool
 |  
 |  Returns True when the argument x is true, False otherwise.
 |  The builtins True and False are the only two instances of the class bool.
 |  The class bool is a subclass of the class int, and cannot be subclassed.
 |  
 |  Method resolution order:
 |      bool
 |      int
 |      object
 |  

帮助(假)

help(False)
Help on bool object:
class bool(int)
 |  bool(x) -> bool
 |  
 |  Returns True when the argument x is true, False otherwise.
 |  The builtins True and False are the only two instances of the class bool.
 |  The class bool is a subclass of the class int, and cannot be subclassed.
 |  
 |  Method resolution order:
 |      bool
 |      int
 |      object
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.