[SOLVED] Python equality statement of the form a==b in [c,d,e]

Issue

This Content is from Stack Overflow. Question asked by KIAaze

I just came across some python code with the following statement:

if a==b in [c,d,e]:
    ...

It turns out that:

>>> 9==9 in [1,2,3]
False
>>> 9==9 in [1,2,3,9]
True
>>> (9==9) in [1,2,3,9]
True
>>> 9==(9 in [1,2,3,9])
False
>>> True in [1,2,3,9]
True
>>> True in []
False
>>> False in []
False
>>> False in [1,2,3]
False

Am I right in assuming that a==b in [c,d,e] is equivalent to (a==b) in [c,d,e] and therefore only really makes sense if [c,d,e] is a list of True/False values?

And in the case of the code I saw b is always in the list [c,d,e]. Would it then be equivalent to simply using a==b?



Solution

Just to throw another factor into the mix, operator chaining needs to be kept in mind as well:

Formally, if a, b, c, …, y, z are expressions and op1, op2, …, opN are comparison operators, then a op1 b op2 c … y opN z is equivalent to a op1 b and b op2 c and … y opN z, except that each expression is evaluated at most once.

The docs there specify "comparison operators", but later down is the addition:

Note that comparisons, membership tests, and identity tests, all have the same precedence and have a left-to-right chaining feature as described in the Comparisons section.

For example, 9==9 in [1,2,3,9] is confusingly the same as 9==9 and 9 in [1, 2, 3, 9].


This Question was asked in StackOverflow by KIAaze and Answered by Carcigenicate It is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.

people found this article helpful. What about you?