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.