The following comparisons produce True:
>>> '1' in '11'
True
>>> ('1' in '11') == True
True
And with the parentheses the other way, I get a TypeError:
>>> '1' in ('11' == True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument of type 'bool' is not iterable
So how do I get False with no parentheses?
>>> '1' in '11' == True False
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
The Python manual says in and == are of equal precedence. Thus, they’re evaluated from left to right by default, but there’s also chaining to consider. The expression you put above ('1' in '11' == True) is actually being evaluated as…
('1' in '11') and ('11' == True)
which of course is False. If you don’t know what chaining is, it’s what allows you to do something like…
if 0 < a < 1:
in Python, and have that mean what you expect (“a is greater than 0 but less than 1”).
Method 2
It has nothing to do with precedence. In Python relational operators chain, and containment is considered a relational operator. Therefore:
'1' in '11' == True
is the same as:
('1' in '11') and ('11' == True)
which is false since True is not equal to “11”.
Method 3
Chaining allows you to write x < y < z, and mean x < y and y < z. Look at this interaction:
>>> (False == True) == False True >>> False == (True == False) True >>> False == True == False False >>>
So in your example, '1' in '11' == True is equivalent to ('1' in '11') and ('11' == True)
Method 4
What happen here?
'1' in '11' == True ==> False
is the same that:
'1' in ('11' == True)
but
('11' == True) ==> False
and
'1' in False
is not defined.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0