无和逻辑操作和/或

2024-09-27 18:01:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图完全理解None作为逻辑andor操作的布尔值的行为,因此我尝试了以下代码:

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


Tags: orand代码innonefalsetruefor
1条回答
网友
1楼 · 发布于 2024-09-27 18:01:34

why is it not consistent with the behavior shown for and? I was expecting both first and cases to return False.

这是完全一致的

and如果第一个操作数为“falsy”,则返回第二个操作数or如果第一个操作数是“truthy”,则返回第二个操作数都不将其操作数转换为布尔值

None是“falsy”,因为如果falsyNone and x返回None,则and返回第一个操作数,而不管x

另外,您的表非常混乱,因为|&是实际的Python运算符(但不是布尔运算符或短路)

相关问题 更多 >

    热门问题