440,676 Members | 2,262 Online
Need help? Post your question and get tips & solutions from a community of 440,676 IT Pros & Developers. It's quick & easy.

# 0 == False but [] != False?

 P: n/a This is a slightly naive question, but I know that 0 can be used to represent False. So >>0 == False True But, I know I can use [] to represent False as in >>if not []: print 'empty' .... empty But then doing the following gives a surprising (to me!) result >>[] == False False Could anybody point out why this is the case? Thanks, Rajarshi May 24 '07 #1
20 Replies

 P: n/a Rajarshi wrote: This is a slightly naive question, but I know that 0 can be used to represent False. So >>>0 == False True But, I know I can use [] to represent False as in >>>if not []: print 'empty' ... empty But then doing the following gives a surprising (to me!) result >>>[] == False False Could anybody point out why this is the case? "if foo:" does not check if "foo == True" or "foo == False" but rather "bool(foo)". For empty lists, strings, tuples, dicts and some other things, "bool(foo) == False", while for lists, etc., with at least one element, "bool(foo) == True". -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco May 24 '07 #2

 P: n/a Rajarshi wrote: This is a slightly naive question, but I know that 0 can be used to represent False. So >>>>0 == False True But, I know I can use [] to represent False as in >>>>if not []: print 'empty' ... empty But then doing the following gives a surprising (to me!) result >>>>[] == False False Could anybody point out why this is the case? Thanks, Rajarshi Meditate on: pyisinstance(False, int) True pyisinstance([], int) False pybool([]) False James May 24 '07 #3

 P: n/a >[] == False False Could anybody point out why this is the case? Writing, "if x" is short for writing "if bool(x)". Evaluating bool(x) checks for a x.__nonzero__() and if that method isn't defined, it checks for x.__len__() to see if x is a non-empty container. In your case, writing "if []" translates to "if len([]) != 0", which evaluates to False. True and False are of type bool which is a subclass of int. So, False really is equal to zero and True really is equal to one. In contrast, the empty list is not of type int. So [] != False eventhough bool([]) == False. Raymond May 24 '07 #4

 P: n/a On May 23, 11:53 pm, Rajarshi 0 == False True But, I know I can use [] to represent False as in >if not []: print 'empty' ... empty But then doing the following gives a surprising (to me!) result >[] == False False Could anybody point out why this is the case? Thanks, Rajarshi This has *got* to rank up there among the VFAQ's of them all, along with the mysterious shared default empty list argument. I think this particular question has been asked in one form or another at least twice a week for the past month! -- Paul May 24 '07 #5

 P: n/a Rajarshi wrote: This is a slightly naive question, but I know that 0 can be used to represent False. So >>>0 == False True But, I know I can use [] to represent False as in >>>if not []: print 'empty' ... empty But then doing the following gives a surprising (to me!) result >>>[] == False False Could anybody point out why this is the case? Because "representing False" (i.e., being false) and "being the same as False" are not the same thing. if x: ... is not the same thing as if x == True: ... it's the same as if bool(x): ... So a more meaningful comparison of your two tests are: >>bool(0) == bool(False) True >>bool([]) == bool(False) True -- Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/ San Jose, CA, USA && 37 20 N 121 53 W && AIM, Y!M erikmaxfrancis Woman was God's _second_ mistake. -- Friedrich Nietzsche May 24 '07 #6

 P: n/a Rajarshi This is a slightly naive question, but I know that 0 can be used torepresent False. So >>>0 == False TrueBut, I know I can use [] to represent False as in >>>if not []: print 'empty' ...emptyBut then doing the following gives a surprising (to me!) result >>>[] == False FalseCould anybody point out why this is the case? False is just a constant. 0, (), '', [], and False are all constants that happen to evaluate to a false value in a Boolean context, but they are not all the same. As a general rule, I've found code like "if x == False" to be a bad idea in ANY language. -- Tim Roberts, ti**@probo.com Providenza & Boekelheide, Inc. May 24 '07 #7

 P: n/a On Thu, 24 May 2007 06:59:32 +0000, Tim Roberts wrote: As a general rule, I've found code like "if x == False" to be a bad idea in ANY language. Surely that should be written as "if (x == False) == True"? -- Steven. May 24 '07 #8

 P: n/a Steven D'Aprano : On Thu, 24 May 2007 06:59:32 +0000, Tim Roberts wrote: >As a general rule, I've found code like "if x == False" to be a bad idea inANY language. Surely that should be written as "if (x == False) == True"? Why compare to False? " if not x : ... " It really doesn't matter if x is False or if it evaluates to False. Many things evaluate to False like [], (), 0, "", None and a few other things. >>def tf(thing): .... if thing : print "True thing", thing .... elif not thing : print "False thing",thing .... else : print "No thing" .... >>tf([]) False thing [] >>tf([1]) True thing [1] >>a = ()tf(a) False thing () >>a=(0)tf(a) False thing 0 >>a= (1,2,3)tf(a) True thing (1, 2, 3) >>tf("abc") True thing abc >>tf("") False thing >>> May 24 '07 #9

 P: n/a On 2007-05-24, Rex Turnbull On Thu, 24 May 2007 06:59:32 +0000, Tim Roberts wrote: >>As a general rule, I've found code like "if x == False" to be a bad idea inANY language. Surely that should be written as "if (x == False) == True"? Why compare to False? That's a joke... I say, that's a joke, son! He was being sarcastic. -- Grant Edwards grante Yow! The FALAFEL SANDWICH at lands on my HEAD and I visi.com become a VEGETARIAN ... May 24 '07 #10

 P: n/a In article <11**********************@q66g2000hsg.googlegroups .com>, Paul McGuire

 P: n/a Donn Cave wrote: Anyone who finds this surprising, might enjoy reading this article from the time several years ago when the feature was being considered. When you have some time - it's long, but interesting. The present confusion is more directly addressed towards the end. Yes, it's the Laura Creighton article again: http://groups.google.com/group/comp....e5e1c8384c0360 If so, be sure to click "More options," then "View thread," and then read the responses. There were many reasonable objections to her points. -- Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/ San Jose, CA, USA && 37 20 N 121 53 W && AIM, Y!M erikmaxfrancis Human salvation lies in the hands of the creatively maladjusted. -- Dr. Martin Luther King, Jr. May 24 '07 #12

 P: n/a On May 24, 1:59 am, Tim Roberts

 P: n/a Dan Bishop wrote: On May 24, 1:59 am, Tim Roberts False is just a constant. 0, (), '', [], and False are all constants thathappen to evaluate to a false value in a Boolean context, but they are notall the same.As a general rule, I've found code like "if x == False" to be a bad idea inANY language. I have a job as a C++ programmer, and they make us write it like that, apparently because the ! operator is hard to see. But "if (x == TRUE)" is discouraged. Find a new employer. I'm not joking. regards Steve -- Steve Holden +1 571 484 6266 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://del.icio.us/steve.holden ------------------ Asciimercial --------------------- Get on the web: Blog, lens and tag your way to fame!! holdenweb.blogspot.com squidoo.com/pythonology tagged items: del.icio.us/steve.holden/python All these services currently offer free registration! -------------- Thank You for Reading ---------------- May 24 '07 #14

 P: n/a Steve Holden wrote: Dan Bishop wrote: >I have a job as a C++ programmer, and they make us write it like that,apparently because the ! operator is hard to see. But "if (x ==TRUE)" is discouraged. Find a new employer. I'm not joking. Really. He's not. That's a perfect example of a style guideline that not only wastes energy, misses the point, but is totally wrong. -- Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/ San Jose, CA, USA && 37 20 N 121 53 W && AIM, Y!M erikmaxfrancis There is another world, which is not of men. -- Li Bai May 24 '07 #15

 P: n/a Thanks a lot for all the responses May 26 '07 #16

 P: n/a In article , Erik Max Francis , Paul McGuire

 P: n/a Donn Cave wrote: Not that it is of no historical interest to review all these reasonable arguments, but allow me to restore the context quote from my follow-up: If the counterpoints are of no historical interest, then the original point must be of no historical interest either, since it was not widely granted as true. -- Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/ San Jose, CA, USA && 37 20 N 121 53 W && AIM, Y!M erikmaxfrancis Fear is an emotion indispensible for survival. -- Hannah Arendt May 29 '07 #18

 P: n/a In article , Erik Max Francis

 P: n/a On Tue, 29 May 2007 11:36:07 -0700, Erik Max Francis wrote: Donn Cave wrote: >Not that it is of no historical interest to review all thesereasonable arguments, but allow me to restore the context quotefrom my follow-up: If the counterpoints are of no historical interest, then the original point must be of no historical interest either, since it was not widely granted as true. I hope you don't get just as confused by expressions like: if not x != 5 *wink* In English, a double negative is usually a positive. So "Not that it is of no historical interest" means "It is of historical interest". I wonder, if somebody with more time on their hands than me were to go through the threads on comp.lang.python before and after the introduction of bools, could we determine whether there were more problems caused by the introduction of True and False than by the lack of them? Although I like using bools, in my heart of hearts I suspect that Laura was right. -- Steven. May 29 '07 #20

 P: n/a Donn Cave wrote: "Not that it is of no historical interest" may have been too hard to follow, my apologies. Yeah, my reading comprehension wasn't up to snuff that night. -- Erik Max Francis && ma*@alcyone.com && http://www.alcyone.com/max/ San Jose, CA, USA && 37 20 N 121 53 W && AIM, Y!M erikmaxfrancis A man that studieth revenge keeps his own wounds green. -- Francis Bacon May 29 '07 #21

### This discussion thread is closed

Replies have been disabled for this discussion.