使用整数枚举器进行 Python 布尔运算符成员资格测试

Tej*_*hav 5 python membership comparison operator-precedence operator-keyword

我正在测试比较和成员运算符的优先级,根据 Python 文档,它们具有相同的优先级。但它显示出奇怪的结果,如下所示,

如果有人可以证明以下代码和相应的输出是合理的..

print( ( True!= 12) in (12,14))  #output: False
print( True!= 12 in (12,14))  #output: True
print( True!= (12 in (12,14)))  #output: False
Run Code Online (Sandbox Code Playgroud)

AGN*_*zer 5

来自https://docs.python.org/3/reference/expressions.html

请注意,比较、成员资格测试和身份测试都具有相同的优先级,并且具有从左到右的链接功能,比较部分中所述。

比较部分我们发现:

比较可以任意链接,例如x < y <= z等价于x < yy <= z,只不过y只计算一次(但在这两种情况下,当发现 为假时z根本不计算)。x < y

所以,你的第二行相当于:

True != 12 and 12 in (12, 14)
Run Code Online (Sandbox Code Playgroud)

其计算结果为 ,True and True其计算结果为True

同样好奇的结构是:

>>> True == True in (True, False)
True

>>> True == False in (True, False)
False

>>> 2 == 2 in (2, 3)
True

>>> 1 == 1 in (2, 3)
False

>>> 1 != 2 in (2, 3)
True

>>> 2 != 1 in (2, 3)
False

>>> 2 in (2, 3) in [True, False]
False
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 3

第一个案例:

print((True != 12) in (12,14))
Run Code Online (Sandbox Code Playgroud)

我们可以说,首先我们评估True != 12给我们的条件True,然后我们评估True元组中的if(12,14)和 that's False

第三种情况:

print(True != (12 in (12,14)))
Run Code Online (Sandbox Code Playgroud)

我们可以说,首先我们评估(12 in (12,14))给我们的条件,True因为12is 在元组中(12,14)。然后我们评估是否True != TrueFalse

第二种情况:

print( True != 12 in (12,14))
Run Code Online (Sandbox Code Playgroud)

所以这是棘手的一个。如果没有括号,我们就无法开始评估条件。为了解释这种情况,我将给您提供下一个示例:如果您尝试以下代码(这与我们试图找出结果的代码非常相似):

print(1 != 2 != 3) #output True
Run Code Online (Sandbox Code Playgroud)

你会得到True,那是因为1 != 22 != 3。正如您可能已经注意到的,它是一个隐式的AND. 上面的代码等于:

print(1 != 2 and 2 != 3) #output True
Run Code Online (Sandbox Code Playgroud)

因此,如果我们将这个逻辑应用到我们的案例中,我们就会对此进行评估:

print( True != 12 and 12 in (12,14)) # => (True and True) #output True
Run Code Online (Sandbox Code Playgroud)