Why is ('a' in arr) in arr
!= 'a' in arr in arr
?
arr = [1, True, 'a', 2]
print(('a' in arr) in arr) # -> True
print('a' in arr in arr) # -> False
Section 6.10 of the Python language reference discusses comparison operators and comparison chaining. in
is considered a comparison operator, and so behaves the same as <
, etc. Without parentheses for explicit grouping, x OP1 y OP2 z
is equivalent to x OP1 y and y OP2 z
for any two comparison operators.
This means that
'a' in arr in arr
without parentheses, is equivalent to
'a' in arr and arr in arr
arr
is not an element of itself, so the expression is False.
Parentheses disable chaining, so
('a' in arr) in arr
is evaluated like any other nested expression. 'a' in arr
is evaluated first to the value True
, then True in arr
is evaluated to also produce True
.
I might be wrong, but I think that in
is like any binary operator, so just like you have a < b < c
equivalent to (a < b) and (b < c)
, you will have
a in b in c
equivalent to
(a in b) and (b in c)
'a' in arr
is True, but arr in arr
is False, that's why you have a False
value.
Given arr=[1,True,'a',2]
,
Decoding first expression: ('a' in arr) in arr
,
step-by-step
('a' in arr) in arr
evaluates to
(True) in [1,True,'a',2]
evaluates to
True
Decoding second expression: ('a' in arr in arr)
step-by-step
('a' in arr in arr)
This is equivalent to ('a' in arr and arr in arr)
which evaluates to (True and False)
which evaluates to (False)
More on: Precedence and associative nature https://www.programiz.com/python-programming/precedence-associativity