提问人:try_to_code 提问时间:7/9/2022 更新时间:7/9/2022 访问量:113
python:如何理解布尔表达式:a 和 b 不在列表中
python: how to understand for Boolean expression: a and b not in list
问:
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
答:
-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,那么当结果显示键插入了值时,您会想要一个异常)。通常,你只在你真正想要默认行为时才使用,而不仅仅是作为一个穷人的替代品来代替实际的成员资格测试。.get
None
int
None
.get
评论
if obj and x not in obj
if (obj) and (x not in obj)