Python 非 compsci 背景的 if 语句和真值测试
Python if statements and truth value testing for non compsci background
经过几个小时的挖掘,这旨在成为一个自我回答的问题,我发现这个思考过程可能对其他可能也没有正式 compsci 背景的人有用。
这一切都源于对为什么要输入一个特定的 if 语句的困惑。
>>>if (2 & 2):
... print("true")
true
为什么要输入这个 if 语句?
我以前对 if 语句的使用都非常简单,所以我想当然地认为只有布尔值 True 才会导致输入 if 语句。在 运行 进入此 if 语句后,什么构成布尔值 True 对我来说并不那么明显。对于具有 compsci 背景的人来说,这当然是显而易见的,但我从未真正深入研究过 if 语句如何确定参数是否为布尔值 True。例如,if (5 > 2) --> True 对任何至少具有 elementary-school 数学背景的人都有意义,所以我认为这是理所当然的。相反,if (2) --> True,对于非 compsci 专家来说似乎不太明显。
例如
>>>2 & 2
2
>>> 2 == True
False
>>>if (2):
... print("true")
true
为什么尽管 2 & 2 的计算结果为 2 的 int 值,但仍输入了 if 语句?为什么在给定 int 值 2 时输入 if 语句,即使 2 本身不是 == True?这是我第一次看到这种类型的行为,它让我从各种其他堆栈溢出问题中了解到,if 语句不是评估 2 的 int 值是否 == True,而是评估 bool(2) == True ,这实际上是正确的。
同样,如果你有计算机科学背景,我相信这一切都很明显,但即使是 bool(2) 和 "truth value testing" 作为短语的想法对我来说也是新的,所以将它添加到二元逻辑运算符中一开始让我有点困惑。例如:
>>>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 还是二进制形式,都应该 return True。
阅读 Truth Value Testing I see a few examples of objects that are considered false. Here, and rather obviously, it makes sense why bool(0) and bool(0b0) returns False. The opposite though, for bool(b'0') and bool(bin(0)), where this seems to return True. Why is this? Because bin() returns a string representation of the number, as is b'0' (a string) not an actual binary value (like 0b0), and since these strings are not empty strings, but rather filled with the characters representing zero, it evaluates to True (See third bullet point of Truth Value Testing 的 python 文档后)。
我举了几个 non-obvious(对我来说)真实性评估测试的例子,以及为什么它们确实合乎逻辑。希望这可以帮助那些可能对 if 语句看似(对我而言)不太常见的用法感到迷惑的人。
经过几个小时的挖掘,这旨在成为一个自我回答的问题,我发现这个思考过程可能对其他可能也没有正式 compsci 背景的人有用。
这一切都源于对为什么要输入一个特定的 if 语句的困惑。
>>>if (2 & 2):
... print("true")
true
为什么要输入这个 if 语句?
我以前对 if 语句的使用都非常简单,所以我想当然地认为只有布尔值 True 才会导致输入 if 语句。在 运行 进入此 if 语句后,什么构成布尔值 True 对我来说并不那么明显。对于具有 compsci 背景的人来说,这当然是显而易见的,但我从未真正深入研究过 if 语句如何确定参数是否为布尔值 True。例如,if (5 > 2) --> True 对任何至少具有 elementary-school 数学背景的人都有意义,所以我认为这是理所当然的。相反,if (2) --> True,对于非 compsci 专家来说似乎不太明显。
例如
>>>2 & 2
2
>>> 2 == True
False
>>>if (2):
... print("true")
true
为什么尽管 2 & 2 的计算结果为 2 的 int 值,但仍输入了 if 语句?为什么在给定 int 值 2 时输入 if 语句,即使 2 本身不是 == True?这是我第一次看到这种类型的行为,它让我从各种其他堆栈溢出问题中了解到,if 语句不是评估 2 的 int 值是否 == True,而是评估 bool(2) == True ,这实际上是正确的。
同样,如果你有计算机科学背景,我相信这一切都很明显,但即使是 bool(2) 和 "truth value testing" 作为短语的想法对我来说也是新的,所以将它添加到二元逻辑运算符中一开始让我有点困惑。例如:
>>>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 还是二进制形式,都应该 return True。
阅读 Truth Value Testing I see a few examples of objects that are considered false. Here, and rather obviously, it makes sense why bool(0) and bool(0b0) returns False. The opposite though, for bool(b'0') and bool(bin(0)), where this seems to return True. Why is this? Because bin() returns a string representation of the number, as is b'0' (a string) not an actual binary value (like 0b0), and since these strings are not empty strings, but rather filled with the characters representing zero, it evaluates to True (See third bullet point of Truth Value Testing 的 python 文档后)。
我举了几个 non-obvious(对我来说)真实性评估测试的例子,以及为什么它们确实合乎逻辑。希望这可以帮助那些可能对 if 语句看似(对我而言)不太常见的用法感到迷惑的人。