我试图完全理解None
作为逻辑and
和or
操作的布尔值的行为,因此我尝试了以下代码:
for a, b in [(None, False), (None, True), (False, None), (True, None)]:
print(f"{str(a):<5} & {str(b):<5}", a and b)
for a, b in [(None, False), (None, True), (False, None), (True, None)]:
print(f"{str(a):<5} | {str(b):<5}", a or b)
这将产生:
None & False: None
None & True : None
False & None : False
True & None : None
None | False: False
None | True : True
False | None : None
True | None : True
最后两例and
预计是由于短路。如果第一条语句为False
,则返回False
,而不检查第二条语句,而如果第一条语句为True
,则直接返回第二条语句。但前两种情况表明None
没有任何布尔值
最后两例or
由于短路再次出现。如果第一个语句为False
,则直接返回第二个语句;如果第一个语句为True
,则返回True
,而不检查第二个语句。但前两种情况表明None
具有负布尔值
我知道这个负值的目的是能够使用a = a or 5
执行默认值之类的操作,但是为什么它与and
的行为不一致呢?我原以为第一批and
病例都会返回False
这是完全一致的
and
如果第一个操作数为“falsy”,则返回第二个操作数or
如果第一个操作数是“truthy”,则返回第二个操作数都不将其操作数转换为布尔值None
是“falsy”,因为如果falsyNone and x
返回None
,则and
返回第一个操作数,而不管x
另外,您的表非常混乱,因为
|
和&
是实际的Python运算符(但不是布尔运算符或短路)相关问题 更多 >
编程相关推荐