python - 比较字符串和布尔值

python - compare string with boolean

我遇到了 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" 与对象 True ("Hello1")
不同 字符串对象 "Test" 与对象 False("Hello2")
不同 但是字符串对象 "Test" 不是 None ("Hello5")

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

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

第三次和第四次比较,你还是在做一个值的比较,但是由于两边都是相同的类型(boolean),所以会比较值。

打印

Hello5 是因为它不是空字符串 ""。您可以通过尝试 "Test" != None 来看到这一点,其中 returns True

虽然它是对大多数 classes 的 None 的比较(None 是 Python 的空值),Python的标准数据类型与其 "null" 值进行比较,它们是:

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

就像一个布尔比较。因此,将 if expression 视为对 if bool(expression).

的隐式转换并没有错

幕后发生的事情是对 class.

__non-zero__(python2.x) or __bool__(python3.x) 方法的求值