Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python evaluation order [duplicate]

Tags:

python

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)
like image 507
dmedvinsky Avatar asked Dec 08 '22 04:12

dmedvinsky


1 Answers

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.

like image 126
Charles Merriam Avatar answered Jan 26 '23 00:01

Charles Merriam