python:如何理解布尔表达式:a 和 b 不在列表中

python: how to understand for Boolean expression: a and b not in list

提问人:try_to_code 提问时间:7/9/2022 更新时间:7/9/2022 访问量:113

问:

def i(obj, x):
    if obj and x not in obj:
        return x
    else:
        return obj

print(i([], 6))
#prints []

def i(obj, x):
    if x and obj not in obj:
        return x
    else:
        return obj

print(i([], 6))
#prints 6

你如何在这里形式化逻辑表达式?
两种情况下的“obj”和“x”都不在“obj”中,是吗? 如果是这样,如何正确阅读这两个表达式。我以为它们是一样的:

if obj and x not in obj
if x and obj not in obj
python list if-statement 逻辑布尔 运算

评论

4赞 slothrop 7/9/2022
运算符优先级是这样的 - 这有帮助吗?if obj and x not in objif (obj) and (x not in obj)
0赞 Thierry Lathuille 7/9/2022
docs.python.org/3/reference/......

答:

-2赞 MigrationMonkey 7/9/2022 #1
obj = []
x = 6

if obj and x not in obj
if x and obj not in obj

第一个条件。“if Obj” 的计算结果为 False,因为列表“obj”为空。不在 obj 中的 x 将计算为 true,因为 x 不在空列表中。此行的计算结果为 false。As False 和 True = False

第二行。“If X”的计算结果为 true,因为大于 0 的整数计算结果为 true。并且“if obj not in obj”将计算为 true,因为 obj 是相同的。从技术上讲,obj 不在 obj 中。Obj 与 OBJ 的 (==) 相同。这是真的,真的。计算结果为 True。

区别在于列表与整数如何被计算为布尔值。

为了回答您的完整问题,第一个布尔值最终返回 x,而第二个布尔值最终返回 obj。

评论

0赞 Thierry Lathuille 7/9/2022
“ x not in obj will evaluate to true ” - 它永远不会被计算,因为第一个条件是 ,这足以决定整个表达式是 False。在这种情况下,Python 总是短路评估。False
0赞 XxJames07- 7/9/2022
在您的答案中还包括运算符优先级
1赞 slothrop 7/9/2022
obj in obj在大多数情况下,它将是 False:对象包含自身是不寻常的。具体来说,是假的,事实上,没有一个列表可以包含自己:会有一个无限的回归。[] in []
1赞 Thierry Lathuille 7/9/2022
实际上,了解这一点是必不可少的,因为这通常用于防止第二部分在可能引发错误的情况下进行评估,例如 .if key in mydict and mydict[key] >42
1赞 ShadowRanger 7/9/2022
此外,在许多情况下,使用这种方式是错误的;它不会区分“键存在且具有值”和“键丢失”(如果您的期望是所有值都是 S,那么当结果显示键插入了值时,您会想要一个异常)。通常,你只在你真正想要默认行为时才使用,而不仅仅是作为一个穷人的替代品来代替实际的成员资格测试。.getNoneintNone.get