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

String python-将字符串与布尔值进行比较,string,python-3.x,comparison,String,Python 3.x,Comparison,我遇到了python将字符串与真/假进行比较的奇怪行为 我认为python会打印以下内容: if "Test" == True: print("Hello1") 但事实并非如此。 所以我写了一些测试用例,但我不理解其中的一些 if "Test" == True: print("Hello1") if "Test" == False: print("Hello2") #This I understand if bool("Test") == True: pri

我遇到了python将字符串与真/假进行比较的奇怪行为

我认为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也没有打印
  • 为什么他会被打印出来,是不是对bool(“测试”)的演员阵容进行了暗示

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

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

但是字符串对象
“Test”
不是
None
(“Hello5”)

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

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

在第三次和第四次比较中,您仍在进行值比较,但由于两侧都是同一类型(布尔值),因此将比较值

打印Hello5
,因为它不是空字符串
“”
。您可以通过尝试
“Test”!=无
,返回

当涉及到大多数类时,它与
None
进行比较(
None
是Python的空值),Python的标准数据类型与它们的“空”值进行比较,它们是:

  • 字符串的空字符串
    “”
  • []
    用于列表(类似于
    ()
    用于元组,
    {}
    用于字典)
  • 0
    对于整数和浮点
就像布尔比较。因此,将
if expression
视为对
if bool(expression)
的隐式强制转换是正确的


幕后正在进行的是对类的(python2.x)或(python3.x)方法的评估。

如果您改进答案以包含对象比较,那么它实际上比启用user762353更好。anwser应该始终独立运行。@M.T前四个比较不是比较对象,而是比较值。要比较对象(或者换句话说,标识)将是
“Test”为True
而不是
“Test”==True
。我想这就是你的意思,但你的措辞模棱两可。请为将来的用户澄清您的答案。@M.T另外,另一个更正:
None
不是(严格地说或其他)一个类;这是一个单身汉。换句话说,它位于类
NoneType
的实例中,该实例只有一个允许的实例:
None
。您应该从答案中删除该类的声明,因为它是虚假信息。除了我提到的事情之外,这是一个非常好的答案。