如果not ''
求值为True
,为什么'' == False
求值为False
?
例如,与False
相比,其他类型(例如0,0.0)的"void "将返回True
:
>>> 0 == False
True
>>> 0.0 == False
True
谢谢
在布尔操作上下文中,以及当控制流语句使用表达式时,以下值被解释为false:
False
,None
,所有类型的数字零,空字符串和容器(包括字符串,元组,列表,字典,set和frozensets)。所有其他值都被解释为true。用户定义对象可以通过提供__bool__()
方法自定义其真值。操作符
https://docs.python.org/3/reference/expressions.html比较not
如果其参数为假则返回True
,否则返回False
。
但:
操作符
<
、>
、==
、>=
、<=
和!=
比较两个对象的值。对象不需要具有相同的类型。…
因为所有类型都是
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
来确定True
或False
的值。这就是为什么人们通常会写像
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的设计者决定True
和False
将是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) == 0
和int(True) == 1
。这就是Python在尝试计算0 == False
时所做的。
另一方面,bool('') == False
。bool([])
和bool({})
也一样。
x
求值为True
并不一定意味着x == True
.