经过几个小时的挖掘,这旨在成为一个自我回答的问题,我发现这个思考过程可能对其他可能没有正式 Compsci 背景的人有用。
这一切都始于对为什么要输入一个特定的 if 语句的困惑。
>>>if (2 & 2):
... print("true")
true
为什么要输入这个 if 语句?
经过几个小时的挖掘,这旨在成为一个自我回答的问题,我发现这个思考过程可能对其他可能没有正式 Compsci 背景的人有用。
这一切都始于对为什么要输入一个特定的 if 语句的困惑。
>>>if (2 & 2):
... print("true")
true
为什么要输入这个 if 语句?
我之前对 if 语句的使用都非常简单,所以我认为这是理所当然的,并且理解只有布尔值 True 会导致输入 if 语句。在遇到这个 if 语句后,什么构成布尔 True,对我来说并不那么明显。这对于那些有 compsci 背景的人来说肯定是显而易见的,但我从未真正深入研究 if 语句如何确定参数是否为布尔值 True 。例如,如果 (5 > 2) --> True 对于至少具有小学数学背景的任何人来说都是有意义的,所以我认为这是理所当然的。相反,如果 (2) --> True,对于非 Compsci 专家来说似乎不太明显。
例如
>>>2 & 2
2
>>> 2 == True
False
>>>if (2):
... print("true")
true
为什么尽管 2 和 2 评估为 int 值 2,但仍输入 if 语句?如果给定 int 值 2,即使 2 本身不是 == True,为什么还要输入 if 语句?这是我第一次看到这种类型的行为,它让我从各种其他堆栈溢出问题中了解到 if 语句不是评估 int 值是否为 2 == True,而是评估 bool(2) == True , 这实际上是真的。
同样,如果您来自 comp sci 背景,我相信这一切都非常明显,但即使是 bool(2) 和“真值测试”这个短语的想法对我来说也是新的,所以将它添加到二元逻辑运算符起初让我有些困惑。例如:
>>>2 & 4
0
>>>if (2 & 4):
... print("true")
>>>bin(2 & 4)
'0b0'
>>>if ('0b0'):
... print("true")
true
>>>if (0b0):
... print("true")
>>>bool(0)
False
>>>bool(0b0)
False
>>>bool(b'0')
True
>>>bool(bin(0))
True
起初,由于误解 if 语句正在评估参数 == True,上面的示例似乎很不合逻辑,因为我认为二进制 1 应该导致 True,而二进制 0 应该导致 False。我不知道为什么大于 1 的整数值,无论是 int 还是二进制形式都应该返回 True。
在阅读了用于真值测试的 python 文档后,我看到了一些被认为是错误的对象示例。在这里,很明显,为什么 bool(0) 和 bool(0b0) 返回 False 是有道理的。相反,对于 bool(b'0') 和 bool(bin(0)),这似乎返回 True。为什么是这样?因为bin()返回数字的字符串表示,因为 b'0'(字符串)不是实际的二进制值(如 0b0),并且由于这些字符串不是空字符串,而是用表示零的字符填充,它评估为 True (请参阅真值测试的第三个要点)。
我举了几个非显而易见的(对我来说)真值评估测试的例子,以及为什么它们确实具有逻辑意义。希望这有助于其他可能对 if 语句看似(对我而言)不太常见的用法感到困惑的人。