On Oct 28, 2010, at 11:08 AM, Ronald Oussoren wrote:


On 28 Oct, 2010, at 16:21, Dan Ross wrote:

I don't think this is Mac specific, but I wonder if someone could explain why these two groups of code behave differently:

[code]

colors = ['red', 'green', 'blue', 'orange', 'fuscia', 'black', 'white']

list_of_matches = []
for x in colors:
    if x == 'red' or 'green' or 'blue':


This parses as:

        if x == ('red' or 'green' or blue'):

This would always lead to the if-test failing: ('red' or 'green' or 'blue') evaluates to True, and x != True. What's observed is the if- test always passing... As the equality operator is higher-precedence than boolean operators, and equal precedence operators group left-to- right, the above parses as:
    if (((x == 'red') or 'green') or 'blue'):

noting that non-empty strings (like 'green') evaluate as True in an if- test, this will test if x == 'red', and if not, it will go on to testing if 'green' evaluates to True (which it does), and so forth.

Dan, you could fix your code as:
    if x == 'red' or x == 'green' or x == 'blue':

But this is better:
    if x in ('red', 'green', 'blue'):

and this scales best:
    good_colors = set(['red', 'green', 'blue'])
    if x in good_colors:


Zach






Ronald
_______________________________________________
Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org
http://mail.python.org/mailman/listinfo/pythonmac-sig
unsubscribe: http://mail.python.org/mailman/options/Pythonmac-SIG

_______________________________________________
Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org
http://mail.python.org/mailman/listinfo/pythonmac-sig
unsubscribe: http://mail.python.org/mailman/options/Pythonmac-SIG

Reply via email to