Python Bool和int比较以及带有布尔值的列表索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python Bool和int比较以及带有布尔值的列表索引相关的知识,希望对你有一定的参考价值。

使用布尔值对列表进行索引工作正常。虽然索引应该是整数。

以下是我在控制台中尝试的内容:

>>> l = [1,2,3,4,5,6]
>>> 
>>> l[False]
1
>>> l[True]
2
>>> l[False + True]
2
>>> l[False + 2*True]
3
>>> 
>>> l['0']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str
>>> type(True)
<type 'bool'>

当我尝试使用l['0']时,它打印出错误,即在索引中预期的int类型,这是显而易见的。然后,甚至'True''False'的类型是Bool,列表上的索引工作正常并自动将其转换为int类型并执行操作。

请解释内部发生的事情。我是第一次发帖,所以请原谅我有任何错误。

答案

结果是布尔实际上是整数。 True为1,False为0. Bool是int的子类型。

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

所以它不是将它们转换为整数,而是将它们用作整数。

(由于历史原因,Bool是整数。在Python中存在bool类型之前,人们使用整数0表示false而1表示true。所以当他们添加bool类型时,他们使布尔值为整数以保持向后兼容性使用这些整数值的旧代码。例如参见http://www.peterbe.com/plog/bool-is-int。)

>>> 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.
另一答案

Python曾经缺乏布尔值,我们只使用整数,0表示FalseTrue表示任何其他整数。因此,当将布尔值添加到语言中时,值FalseTrue可以被解释器视为整数值01,以帮助向后兼容。在内部,boolint的子类。

换句话说,以下等式为True:

>>> False == 0
True
>>> True == 1
True
>>> isinstance(True, int)
True
>>> issubclass(bool, int)
True

当你发现:

>>> True * 3
3

但是,这并没有扩展到字符串。

另一答案

......布尔是普通整数的子类型。

Source

如你所见,False0True1

以上是关于Python Bool和int比较以及带有布尔值的列表索引的主要内容,如果未能解决你的问题,请参考以下文章

整型以及布尔值的转换 字符串详解

字符串布尔比较 - 为啥?

Python数据结构之布尔类型(bool)

显示带有来自 Core Data 的布尔值的 .sheet

如何在 Python 中获得布尔值的相反(否定)?

Python中的bool类型