Python - 将字符串与布尔值进行比较

8

我发现了一种关于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会被打印出来,是因为将"Test"强制转换为布尔值时是隐式进行的吗?
2个回答

7
在前两个比较中,您正在检查字符串"Test"是否与对象TrueFalse具有相同的值。这是一个值比较。
如果它们具有不同的类型,则比较将返回False。您也可以在比较列表、数字等时看到这一点:[1]==1(假),(1,)==[1](假)。
在第三个和第四个比较中,您仍在进行值比较,但由于双方都是相同类型(布尔类型),因此将比较值。
打印Hello5是因为它不是空字符串""。您可以通过尝试"Test" != None来了解这一点,它会返回True
尽管对于大多数类而言,它是与None进行比较(None是Python的null值),但Python的标准数据类型是与它们的“null”值进行比较的,它们是:
  • 对于字符串来说,空字符串"",
  • 对于列表来说,空列表[](同样适用于元组()和字典{}),
  • 对于整数和浮点数来说,为零的0,

就像布尔比较一样。因此,将if expression视为隐式转换为if bool(expression)是没有问题的。

在底层发生的事情是对类的__non-zero__(python2.x)或__bool__(python3.x)方法进行评估。


如果您改进了答案,使其包含对象比较,那么它实际上比用户762353的答案更好。答案应该独立自主。 - JDurstberger
1
@M.T 前四个比较并不是比较对象,而是比较值。要比较对象(或者换句话说,是身份),应该是 "Test" is True 而不是 "Test" == True。我想这就是你的意思,但是你的措辞有些含糊不清。请为未来的用户澄清你的答案。 - eestrada
@M.T 另外,还有一个更正:None 不是(严格或其他方式)一个类;它是一个单例。换句话说,它是 NoneType 类的一个实例,只允许有一个实例:None。你应该从你的答案中删除它是一个类的声明,因为这是错误的信息。除了我提到的事情,这是一个非常好的答案。 - eestrada

2
在Hello1、Hello2和Hello5的情况下,进行的是对象比较而不是布尔比较。
这意味着: - 字符串对象"Test"与True对象("Hello1")不同。 - 字符串对象"Test"与False对象("Hello2")不同。 - 但是字符串对象"Test"不是None对象("Hello5")。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接