我决定将
-1
转换为 bool 来检查结果是什么。
与我的预期相反,
bool(-1)
会返回False
,它返回True
。
为什么会这样?
根据 Python 3 文档,大多数被认为错误的内置对象是:
- 定义为 false 的常量:None 和 False。
- 任何数字类型的零:0, 0.0, 0j, Decimal(0), Fraction(0, 1)
- 空序列和集合:''、()、[]、{}、set()、range(0)
请注意,它仅指定零为假,而不是任何等于或小于 0 的值。这在各种其他编程语言中也很常见。
TL;博士
是的,这是预期的。大多数编程语言只认为 0 为假。
详细
当您考虑 -1 在处理器中的表示方式时,这是有道理的。通常,您可以使用 2 的补码 将正数转换为其对应的负数。 2 的补数通过 将所有位反转并加 1 来表示负二进制数。假设我们有一个 4 位架构,十进制 1 表示为 0001。要得到其负数表示,请将所有位反转并加 1,因此 0001 变为 1110 + 1 = 1111。
当我们想知道一个值是否为
false
时,我们可以 or
它的所有输入,如果结果为 0,则为 false,否则为 true,因此 -1 == true 是完全合理的.
我们使用 2 的补码,而不是 1 的补码(我们只是反转所有位而不加 1)的原因正是因为我们不希望能够同时表示 0 和 -0。
在数字上,只有
0
(评估后)才能做出False
,如下所示:
print(bool(0)) # False
并且,
None
和空字符串也可以组成False
,如下所示:
print(bool(None)) # False
print(bool("")) # False
并且,以下这些可以制作
True
,如下所示:
print(bool("0")) # True
print(bool("None")) # True
print(bool(" ")) # True
print(bool("False")) # True
另外,
1
为True
,0
为False
,如下图:
print(1 == True) # True
print(0 == False) # True