Python evaluation order [duplicate]
Here's the code, I don't quite understand, how does it work. Could anyone tell, is that an expected behavior?
$ipython
In [1]: 1 in [1] == True
Out[1]: False
In [2]: (1 in [1]) == True
Out[2]: True
In [3]: 1 in ([1] == True)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/dmedvinsky/projects/condo/condo/<ipython console> in <module>()
TypeError: argument of type 'bool' is not iterable
In [4]: from sys import version_info
In [5]: version_info
Out[5]: (2, 6, 4, 'final', 0)
This is an example of "chaining" which is a gotcha in Python. It's a (possibly silly) trick of Python that:
a op b op c
is equivalent to:
(a op b) and (b op c)
for all operators of the same precedence. Unfortunately, in
and ==
have the same precedence, as do is
and all comparisons.
So, here is your unexpected case:
1 in [1] == True # -> (1 in [1]) and ([1] == True) -> True and False -> False
See See http://docs.python.org/reference/expressions.html#summary for the precedence table.
精彩评论