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)
来自https://docs.python.org/3/reference/expressions.html:
请注意,比较、成员资格测试和身份测试都具有相同的优先级,并且具有从左到右的链接功能,如比较部分中所述。
在比较部分我们发现:
比较可以任意链接,例如
x < y <= z等价于x < y和y <= 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)
第一个案例:
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 != True是False。
第二种情况:
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 != 2和2 != 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)