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

Alt*_*yyr 6 string comparison python-3.x

我遇到了一个奇怪的python行为,比较一个字符串与True/False.

我以为python会打印如下:

if "Test" == True:
    print("Hello1")
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.所以我写了一些测试用例,我不明白其中的一些.

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")
Run Code Online (Sandbox Code Playgroud)

产量

>> Hello3
>> Hello4
>> Hello5
Run Code Online (Sandbox Code Playgroud)

所以我不明白:

  • 如果没有打印Hello1,为什么不是Hello2?
  • 为什么要打印Hello5,是否强制转换为bool("Test")?

M.T*_*M.T 7

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

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

在第三次和第四次比较中,您仍在进行值比较,但由于双方的类型相同(布尔值),因此它将比较值。

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

None虽然它是与大多数类(Python 的 null 值)进行比较None,但 Python 的标准数据类型是与它们的“null”值进行比较,即:

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

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

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