【问题标题】:python - compare string with booleanpython - 将字符串与布尔值进行比较
【发布时间】:2015-12-11 08:17:54
【问题描述】:

我遇到了 python 比较字符串与 True/False 的奇怪行为。

我以为python会打印如下:

if "Test" == True:
    print("Hello1")

但事实并非如此。 所以我写了一些测试用例,有些看不懂。

if "Test" == True:
    print("Hello1")

if "Test" == False:
    print("Hello2")

#This I understand
if bool("Test") == True:
    print("Hello3")

#This I understand too    
if bool("") == False:
    print("Hello4")

if "Test":
    print("Hello5")

输出

>> Hello3
>> Hello4
>> Hello5

所以我不明白:

  • 如果不打印 Hello1 为什么也不打印 Hello2?
  • 为什么会打印 Hello5,是否对 bool("Test") 进行了隐式转换?

【问题讨论】:

    标签: string python-3.x comparison


    【解决方案1】:

    在前两个比较中,您正在检查字符串 "Test" 是否与对象 TrueFalse 具有相同的值。这是一个价值比较。

    如果它们有不同的类型,比较将返回False。您在比较列表、数字等时也可以看到这一点:[1]==1 (false)、(1,)==[1] (false)。

    在第三次和第四次比较中,你仍然在做一个值比较,但是由于双方都是相同的类型(boolean),所以它会比较值。

    Hello5 被打印,因为它不是空字符串""。您可以通过尝试"Test" != None 看到这一点,它返回True

    当涉及到大多数类时,它是与None 的比较(None 是 Python 的 null 值),Python 的标准数据类型与其“null”值进行比较,它们是:

    • 空字符串""为字符串,
    • [] 用于列表(类似() 用于元组,{} 用于字典),
    • 0 用于整数和浮点数,

    就像一个布尔比较。因此,将if expression 视为if bool(expression) 的隐式转换并没有错。

    幕后发生的事情是评估类的__non-zero__(python2.x) 或__bool__(python3.x) 方法。

    【讨论】:

    • 如果您改进答案以包含对象比较,那么实际上比 user762353 更好。 anwser 应该始终独立存在。
    • @M.T 前四个比较不是比较对象,而是比较值。比较对象(或换句话说,身份)将是"Test" is True 而不是"Test" == True。我认为这就是您的意思,但是您的措辞含糊不清。请为未来的用户澄清您的答案。
    • @M.T 另外,另一个更正:None 不是(严格来说或其他)一个类;这是一个单身人士。换句话说,它在类NoneType 的一个实例中,它只有一个允许的实例:None。您应该从您的答案中删除它是一个类的声明,因为它是虚假信息。除了我提到的事情之外,这是一个非常好的答案。
    【解决方案2】:

    在 Hello1、Hello2 和 Hello5 的情况下,存在对象比较而不是布尔比较。

    这意味着
    字符串对象"Test" 与对象True 不同(“Hello1”)
    字符串对象"Test" 与对象False("Hello2") 不同
    但字符串对象"Test" 不是None ("Hello5")

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 2020-06-04
      • 2021-11-05
      • 2021-11-20
      • 2017-04-22
      • 1970-01-01
      相关资源
      最近更新 更多