Python条件下的操作评估顺序

问题描述

如果我有类似a = [1,2,3]的内容,并且写了类似1 in a == True的语句,则该表达式的结果似乎为假。

但是,如果我写(1 in a) == True,则结果为true。

我对Python如何评估第一个语句最终达到false感到困惑。

解决方法

==in都被视为比较运算符,这意味着operator chaining生效:

比较可以任意链接,例如x < y <= z等效于x < y and y <= z,除了y仅被评估一次(但在两种情况下,z都不被评估)全部x < y被发现为假)。

此链接使您可以编写:

if 0 <= x < 20: # meaning: if x >= 0 and x < 20:

因此,表达式1 in a == True被链接为1 in a and a == True,并且由于该and的右侧为假,因此整个表达式都是假。

当您用括号“隔离”表达式的一部分时,不会发生此链接,这就是(1 in a) == True发挥预期作用的原因。


已经解释了,将布尔值与True(或与此相关的False)进行比较并不是您真正应该做的事情,因为这会导致逻辑上无限的情况,例如:

if (((a == 7) == True) != False) == True # 'a == 7' already a boolean.

最好只使用以下一种:

if expression        # if comparing with True
if not expression    # if comparing with False

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...