经过几个小时的挖掘,我发现这个思考过程可能对其他可能也不是来自正式 compsci 背景的人有用。
这一切都始于对为什么要输入一个特定的if语句的困惑。
>>>if (2 & 2):
... print("true")
true
为什么输入此 if 语句?
我以前使用 if 语句都非常简单,所以我认为这是理所当然的,并且理解只有布尔值 True 会导致输入 if 语句。什么构成布尔值 True,在遇到这个 if 语句后对我来说并不那么明显。对于那些具有 compsci 背景的人来说,这当然是显而易见的,但我从未真正深入研究过如果语句如何确定该论点是否为布尔 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,为什么输入 if 语句,即使 2 本身不是 == True?这是我第一次看到这种类型的行为,它让我从其他各种堆栈溢出问题中了解到,if 语句不是在计算 int 值 2 == True,而是计算 bool(2) == True,这实际上是 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 语句看似(对我来说)不太常见的用法感到困惑的人。