python:将空字符串与false进行比较是错误的,为什么?

Python: Comparing empty string to False is False, why?

如果not ''True进行评价,为什么'' == FalseFalse进行评价?

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

1
2
3
4
>>> 0 == False
True
>>> 0.0 == False
True

谢谢


In the context of Boolean operations, and also when expressions are used by control flow statements, the following values are interpreted as false: False, None, numeric zero of all types, and empty strings and containers (including strings, tuples, lists, dictionaries, sets and frozensets). All other values are interpreted as true. User-defined objects can customize their truth value by providing a __bool__() method.

The operator not yields True if its argument is false, False otherwise.

https://docs.python.org/3/reference/expressions.html#comparisons

但是:

The operators <, >, ==, >=, <=, and != compare the values of two objects. The objects do not need to have the same type.

...

Because all types are (direct or indirect) subtypes of object, they inherit the default comparison behavior from object. Types can customize their comparison behavior by implementing rich comparison methods like __lt__() ...

https://docs.python.org/3/reference/expressions.html#boolean-operations

因此,技术实现的答案是,它的行为方式是这样的,因为not==使用不同的比较。not使用一个对象的"真值"__bool__,而==使用__eq__,这是一个对象与另一个对象的直接比较。因此,有可能问一个物体,它是否认为自己是真实的或虚假的,而不是问它,它是否认为自己等于另一个物体。其默认实现的排列方式是,两个对象都可以认为自己是错误的,但不能认为自己彼此相等。


对于''[]来说,实际上等于False是没有意义的,因为它们是明显不同的值:字符串和列表。如果他们两个都相等,那么他们就必须相等。它们只是"虚假的",这意味着当它们被转换为布尔值时,它们会变成虚假的。

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

not是一个返回布尔值的操作。它返回的布尔值取决于操作数是否为假。因此,not x不等于x==False,相当于bool(x)==False


这样的比较不是"Python式的"(也就是说,经验丰富的Python程序员自然不会这么做)。Pythonic方法是在一个布尔上下文中使用一个值,如if语句,并让解释器以无形的方式应用bool内置的值来确定TrueFalse值。这就是为什么人们通常编写代码,比如

1
2
3
4
5
6
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的设计者认为TrueFalsebool类型的实例,boolint的子类。因此,True1比较,False0比较。数值转换解释了浮点(并且,就这一点而言,是复杂的)结果。

但仅仅因为一个bool(x) == True并不意味着x == True,任何超过bool(x) == False意味着x == False。还有许多其他的价值观认为是错误的,最著名的是

  • 数值零点
  • None
  • 空字符串
  • 空容器(列表、元组、dict)

他们不可能都平等!


如果您想查看官方解释,只需按如下方式进行赋值:

1
2
3
4
5
6
7
8
9
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('') == False。同样适用于bool([])bool({})

xTrue的评价并不一定意味着x == True