我遇到了一个奇怪的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
所以我不明白:
答案 0 :(得分:3)
在前两个比较中,您要检查字符串"Test"
是否与对象True
或False
具有相同的值。这是一个价值比较。
如果他们的类型不同,则比较将返回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”)