4
votes

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)
1
-1: This is completely and trivially covered in the Python documentation. docs.python.org/reference/expressions.html#summary. This doesn't seem to be a "question"; it seems to be an actual refusal to read the Python documentation. - S.Lott
Actually, this threw me when I read it. It's Python comparison chaining, but with an unusual pair of operators. S.Lott: don't be so quick to condemn questions. Python comparison chaining is an unusual feature of the language, and this is an unusual application of chaining. - Ned Batchelder

1 Answers

15
votes

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.