小编典典

False == 0 和 True == 1 是实现细节还是由语言保证?

all

是否保证False == 0and True == 1, 在 Python
中(假设它们没有被用户重新分配)?例如,是否以任何方式保证以下代码将始终产生相同的结果,无论 Python 的版本是什么(现有的和可能的未来版本)?

0 == False  # True
1 == True   # True
['zero', 'one'][False]  # is 'zero'

任何对官方文档的参考将不胜感激!

编辑 :正如许多答案中所述,bool继承自int. 因此,这个问题可以改写为:“文档是否正式说程序员可以依赖从整数继承的布尔值,
以及值01?”。这个问题与编写不会因为实现细节而失败的健壮代码有关!


阅读 115

收藏
2022-05-06

共1个答案

小编典典

在 Python 2.x 中,这 不能 保证,因为它可以重新分配TrueFalse重新分配。但是,即使发生这种情况,布尔 True 和布尔
False 仍会正确返回以进行比较。

在 Python 3.x中TrueandFalse是关键字,并且总是等于1and 0

在 Python 2 中的正常情况下,在 Python 3 中总是:

Falseobject 的类型bool是以下的子类int

    object
       |
     int
       |
     bool

['zero','one'][False]这是在您的示例中起作用的唯一原因。它不适用于不是整数子类的对象,因为列表索引仅适用于整数或定义__index__方法的对象。

编辑:

当前的 python 版本和 Python 3 的版本都是如此。python
2
文档和 Python
3
的文档都说:

整数有两种类型: […] 整数 (int) […] 布尔 (bool)

在布尔小节中:

布尔值:它们代表真值 False 和 True […] 在几乎所有上下文中,布尔值的行为分别类似于值 0 和
1,例外的是当转换为字符串时,字符串“False”或“True” ” 分别返回。

还有,对于 Python 2

在数字上下文中(例如,当用作算术运算符的参数时),它们 [False 和 True] 的行为分别类似于整数 0 和 1。

所以布尔值在 Python 2 和 3 中被明确地视为整数。

所以在 Python 4 出现之前你是安全的。;-)

2022-05-06