Richard Thomas wrote: > On 27/09/2007, Casey <[EMAIL PROTECTED]> wrote: > >> On Sep 27, 12:48 pm, "Simon Brunning" <[EMAIL PROTECTED]> >> wrote: >> >>> On 9/27/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote: >>> >>> >>>> I tried writing a true and false If statement and didn't get >>>> anything? I read some previous posts, but I must be missing >>>> something. I just tried something easy: >>>> >>>> a = ["a", "b", "c", "d", "e", "f"] >>>> >>>> if "c" in a == True: >>>> Print "Yes" >>>> >>>> When I run this, it runs, but nothing prints. What am I doing wrong? >>>> >>> Just use >>> >>> if "c" in a: >>> >>> and all will be well. The True object isn't the only truthy value in >>> Python - see <http://docs.python.org/lib/truth.html>. >>> >> I would recommend the OP try this: >> >> run the (I)python shell and try the following: >> >> >>>>> a = [x for x in "abcdefg"] >>>>> a >>>>> >> ['a','b','c','d','e','f','g'] >> >>>>> "c" in a >>>>> >> True >> >>>>> "c" in a == True >>>>> >> False >> >>>>> ("c" in a) == True >>>>> >> True >> >> The reason your conditional failed is that it was interpreted as "c" >> in (a == True) which is False. >> the "==" operator binds at a higher precedence level than the "in" >> operator, just as multiplication >> binds higher than addition >> >> > > Actually it evaluates '("c" in a) and (a == True)'. You can check like so: > > import dis > a = list("abcdef") > dis.dis(lambda: "c" in a == True) > > And just follow the bytecode operations. > Yikes. So I did that and you're correct. I've always looked at chained comparisons with mild suspicion. Now I guess that suspicion is justified. Interpreting a<b<c as a<b and b<c make perfect sense to me, but interpreting "c" in a == True as ("c" in a) and (a == True) is not at all natural.
Gary Herron > -- Richard. > > >> -- >> http://mail.python.org/mailman/listinfo/python-list >> >> -- http://mail.python.org/mailman/listinfo/python-list