Python 为什么(1 in[1,0]==True)的计算结果为False?
当我在看我的答案时,我发现我不明白我自己的答案 我真的不明白这是如何被解析的。为什么第二个示例返回FalsePython 为什么(1 in[1,0]==True)的计算结果为False?,python,syntax,operator-precedence,Python,Syntax,Operator Precedence,当我在看我的答案时,我发现我不明白我自己的答案 我真的不明白这是如何被解析的。为什么第二个示例返回False >>> 1 in [1,0] # This is expected True >>> 1 in [1,0] == True # This is strange False >>> (1 in [1,0]) == True # This is what I wanted it to be True &
>>> 1 in [1,0] # This is expected
True
>>> 1 in [1,0] == True # This is strange
False
>>> (1 in [1,0]) == True # This is what I wanted it to be
True
>>> 1 in ([1,0] == True) # But it's not just a precedence issue!
# It did not raise an exception on the second example.
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
1 in ([1,0] == True)
TypeError: argument of type 'bool' is not iterable
但是对于我的例子,1in([1,0]==True)
作为一个表达式是没有意义的,因此没有两种(公认错误的)可能的解释,只有一种可能:
>>> (1 in [1,0]) == True
Python实际上在这里应用了比较运算符链接。表达式被翻译为
(1 in [1, 0]) and ([1, 0] == True)
这显然是错误的
这也适用于以下表达式:
a < b < c
a
翻译成
(a < b) and (b < c)
(a
(不计算b
两次)
有关详细信息,请参阅。运算符优先级。。。
=
比中的绑定得更紧,因此首先计算[1,0]==True
,然后将其结果输入到其他结果中的1。我已经删除了Python-2.7标记,因为Python 3.2的行为方式相同。@Marc B:没有解释第二个expression@MarcB,这个问题包括一个使用括号来反驳这种解释的测试。关于这一点的额外证明,1在[1,0]==[1,0]
中的计算结果为True
。我一直认为这是一个语言难题。我更希望
中的运算符比其他比较运算符具有更高的优先级,并且它不是链式的。但也许我错过了一个用例。很好的捕捉,我甚至没有想到这一点。允许中的链接没有多大意义-毕竟x
是有意义的,但是x在y中在z
@Sven有用:也许吧。可读性:绝对不是。Python声称用这种约定来模拟常见的数学排版,但当在
中与一起使用时,情况就不再是这样了,这使得它非常违反直觉。@KonradRudolph:我看到过类似于“1”的想法≤ x∈ ℝ" 在数学课文中不止一次,但我基本上同意你的观点。
a < b < c
(a < b) and (b < c)