将空字符串与False比较是False,为什么?



如果not ''求值为True,为什么'' == False求值为False ?

例如,与False相比,其他类型(例如0,0.0)的"void "将返回True:

>>> 0 == False
True
>>> 0.0 == False
True

谢谢

在布尔操作上下文中,以及当控制流语句使用表达式时,以下值被解释为false: False, None,所有类型的数字零,空字符串和容器(包括字符串,元组,列表,字典,set和frozensets)。所有其他值都被解释为true。用户定义对象可以通过提供__bool__()方法自定义其真值。

操作符not如果其参数为假则返回True,否则返回False

https://docs.python.org/3/reference/expressions.html比较

但:

操作符<>==>=<=!=比较两个对象的值。对象不需要具有相同的类型。

因为所有类型都是object的(直接或间接)子类型,所以它们继承了object的默认比较行为。类型可以通过实现丰富的比较方法自定义比较行为,如__lt__()

https://docs.python.org/3/reference/expressions.html布尔操作

所以,技术实现的答案是,它的行为方式,因为not==使用不同的比较。not使用__bool__,即"真值"。而==使用__eq__,直接比较一个对象与另一个对象。所以我们可以问一个对象它是否认为自己是真值还是假值,然后再问它是否认为自己等于另一个对象。它的默认实现是这样安排的:两个对象都可以认为自己,但不认为自己彼此相等。

''[]实际上等于False是没有意义的,因为它们显然是不同的值:字符串和列表。如果它们都等于False,它们就必须相等*。它们只是"假值",这意味着当它们被转换为布尔值时,结果为假值。

(*在任何合理构造的语言中)

not是一个返回布尔值的操作。返回哪个布尔值取决于操作数是否为false。所以not x不等于x==False;它相当于bool(x)==False

这样的比较不是" python式的" (即:这不是一个有经验的Python程序员自然会做的)。python的方法是在布尔上下文中使用一个值,比如if语句,然后让解释器不可见地应用内置的bool来确定TrueFalse的值。这就是为什么人们通常会写像

这样的代码
if lst:
    print(headers)
    for item in lst:
        print(item.format())
else:
    print(no_data_message)

而不是使用常见但不太python化的if len(lst):或更笨拙但功能正确的if len(lst) > 0:

在某些方面,Python的设计者决定TrueFalse将是bool类型的实例,而bool将是int的子类。因此,True比较等于1, False比较等于0。数值转换负责浮点(以及就此而言,复数)结果。

但是仅仅因为bool(x) == True并不意味着x == True,就像bool(x) == False并不意味着x == False一样。还有许多其他值可以计算false,最著名的是

  • 数字0
  • None
  • 空字符串
  • 空容器(列表,元组,字典)

它们不可能都是相等的!

如果您想查看官方解释,只需像这样转换您的值:

print(bool(None) == False)
print(False == False)
print(bool(0) == False)
print(bool(0.0) == False)
print(bool(0j) == False)
print(bool('') == False)
print(bool(()) == False)
print(bool([]) == False)
print(bool({}) == False)

因为int(False) == 0int(True) == 1。这就是Python在尝试计算0 == False时所做的。

另一方面,bool('') == Falsebool([])bool({})也一样。

x求值为True并不一定意味着x == True .

最新更新