【问题标题】:Python if statements and truth value testing for non compsci background非 compsci 背景的 Python if 语句和真值测试
【发布时间】:2019-10-21 13:47:26
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python boolean bitwise-operators logical-operators truthiness


    【解决方案1】:

    我之前对 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。

    阅读Truth Value Testing 的python 文档后,我看到了一些被认为是错误的对象示例。在这里,很明显,为什么 bool(0) 和 bool(0b0) 返回 False 是有道理的。相反,对于 bool(b'0') 和 bool(bin(0)),这似乎返回 True。为什么是这样?因为bin() 返回数字的字符串 表示,b'0'(字符串)不是实际的二进制值(如 0b0),并且由于这些字符串不是空字符串,而是用代表零的字符填充,它的计算结果为 True(参见 Truth Value Testing 的第三个要点)。

    我举了几个(对我来说)不明显的真值评估测试的例子,以及为什么它们确实具有逻辑意义。希望这有助于其他可能对 if 语句看似(对我而言)不太常见的用法感到困惑的人。

    【讨论】:

    • 你的倒数第二段是错误的。 b11 是二进制 3,一个数字(b0 也是如此)。 b'11'是两个字符的字节串,类似于字符串'11',与二进制数无关。 bin(0) 确实导致了字符串表示,'0b0'。所有非空字符串——包括字节串——都是真的,而空字符串是假的。 bool() 不返回任何字符串表示形式 - 它返回 TrueFalse,具体取决于参数是真还是假。请参阅 this answer 获取有用的虚假值表。
    • 值得注意的是,bool(b'0')True,因为 b'0' 是一个非空字节串,而不是一个零数字 - 那将是 0b0。还要注意0b0'0b0' 非常不同。另请注意,“真”和“假”值的概念因编程语言而异。 PHP 对 falsy 值的定义比 Python 宽松得多,Ruby 的定义要严格得多,而像 Java 这样的语言没有“真”与“falsy”的概念,它们的if 条件必须是一个适当的布尔值。
    • @Amadan 感谢您的意见,以及对其他语言对真实的其他解释的参考。我不确定第二段到最后一段有什么“错误”。我很高兴更新它,但看不到您所引用的确切内容是不正确的。我在那里没有提到 b11。当我解释说“因为 bool() 返回数字的字符串表示形式,而不是实际的二进制值,并且由于字符串不是空字符串,而是用表示零的字符,它的计算结果为 True"
    • 我说明了问题所在:“bool() 返回一个字符串表示”。是bin() 这样做的。其余的是对您的示例的评论(特别是暗示 b’11’ 应该是二进制数,或者 ’0b0' 是任何类型的数字)。
    • @Amadan 好的,是的!谢谢你。我有 bin() 的文档链接,但超链接标题中的 bool() 是一个错字。谢谢你指出这一点。我还更新了最后一个代码部分中的真实示例以使其更清晰。
    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多