0

经过几个小时的挖掘,这旨在成为一个自我回答的问题,我发现这个思考过程可能对其他可能没有正式 Compsci 背景的人有用。

这一切都始于对为什么要输入一个特定的 if 语句的困惑。

>>>if (2 & 2):
...    print("true")
true

为什么要输入这个 if 语句?

4

1 回答 1

0

我之前对 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 语句看似(对我而言)不太常见的用法感到困惑的人。

于 2019-06-06T04:17:49.750 回答