是false == 0,python中的true == 1是一个实现细节,还是由语言保证?
-
02-10-2019 - |
题
是否保证 False == 0
和 True == 1
, ,在Python中(假设他们没有被用户重新分配)?例如,是否以任何方式保证,以下代码始终会产生相同的结果,无论python版本(现有和可能的未来)版本是什么?
0 == False # True
1 == True # True
['zero', 'one'][False] # is 'zero'
对正式文档的任何提及将不胜感激!
编辑: :正如许多答案中指出的那样, bool
继承 int
. 。因此,可以重新提出这个问题:“文档是否正式表明程序员可以依靠从整数继承的布尔人, 与值 0
和 1
?”。这个问题与编写强大的代码有关,该代码由于实现细节而不会失败!
解决方案
在Python 2.x中,这是 不是 保证可能有可能 True
和 False
重新分配。但是,即使发生这种情况,Boolean True和Boolean false仍然可以正确返回以进行比较。
在Python 3.x中 True
和 False
是关键字,始终等于 1
和 0
.
在Python 2的正常情况下,始终在Python 3中:
False
对象是类型 bool
这是一个子类 int
:
object
|
int
|
bool
这是您示例中的唯一原因, ['zero', 'one'][False]
确实有效。它不会与不是整数子类的对象,因为索引仅适用于整数或定义一个的对象 __index__
方法(谢谢 马克·迪金森).
编辑:
当前的python版本和python 3是正确的。 Python的文档2.6 和 Python的文档3 两者都说:
整数有两种类型:[...]整数(int)[...]布尔值(bool)
并在布尔小节中:
布尔人:这些代表真实价值虚假和真实[...]布尔值分别像值0和1一样,在几乎所有上下文中,例外是,当转换为字符串时,字符串“ false”或“ true” “分别返回。
也有 对于Python 2:
在数字上下文中(例如,当用作算术运算符的参数时),它们[false和true]分别像整数0和1一样行为。
因此,布尔人被明确视为Python 2.6和3中的整数。
因此,直到Python 4出现之前,您都是安全的。 ;-)
其他提示
链接到PEP讨论Python 2.3中的新布尔类型: http://www.python.org/dev/peps/pep-0285/.
当将bool转换为int时,整数值始终为0或1,但是当将int转换为bool时,除0以外的所有整数中,布尔值都是正确的。
>>> int(False)
0
>>> int(True)
1
>>> bool(5)
True
>>> bool(-5)
True
>>> bool(0)
False
在Python 2.X中,根本不能保证:
>>> False = 5
>>> 0 == False
False
因此它可能会改变。在python 3.x中,是的,错误,没有 保留的单词, ,因此上述代码将行不通。
通常,使用布尔值,您应该假设虽然false始终具有整数值为0(只要您不更改它,如上所述),True可能具有其他值。我不一定要依靠任何保证 True==1
, ,但是在Python 3.X上,无论如何,情况将永远是这种情况。
非常简单。由于Bool与将整数评估为BOOL有关,因此只有零给出了错误的答案。所有非零值,浮点,整数,包括负数或您的内容,都将返回true。
一个很好的例子说明这是有用的,就是确定设备的功率状态。 ON是任何非零值,OFF为零。从电子上讲,这很有意义。
要确定在值之间的真或错误,您必须有一些与之进行比较的东西。这适用于字符串和数值,使用 ==
或者 !=
或者 <
, >
>=
, <=
, , ETC。
您可以将整数分配给变量,然后根据该变量值获得真或错误。
写吧 int(False)
你会得到 0
, ,如果您输入 int(True)
它将输出 1
假是一个布尔。它有不同的类型。它与0是一个整数不同的对象。
0 == False
返回true是因为false被铸成整数。 int(false)返回0
==操作员的Python文档说(help('==')):
操作员
<
,>
,==
,>=
,<=
, , 和!=
比较两个对象的值。对象不必具有相同的类型。如果两者都是数字,则将它们转换为普通类型。
结果,错误将转换为一个整数,以进行比较。但这与0不同。
>>> 0 is False
False