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

时间:2015-12-11 08:17:55

标签: string python-3.x comparison

我遇到了一个奇怪的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”)?

2 个答案:

答案 0 :(得分:3)

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

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

在第三和第四次比较中,您仍在进行值比较,但由于两边的类型相同(布尔值),因此会比较这些值。

打印

Hello5,因为它不是空字符串""。您可以通过尝试返回"Test" != None的{​​{1}}来查看此内容。

虽然它与大多数类的True进行比较(None是Python的空值),但Python的标准数据类型与它们的&#进行比较34;空"价值,是:

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

就像一个布尔比较。因此,将0视为对if expression的隐式转换是没有错的。

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

答案 1 :(得分:1)

对于Hello1,Hello2和Hello5,存在对象比较而不是布尔比较。

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