0 == False but [] != False?

Discussion in 'Python' started by Rajarshi, May 24, 2007.

  1. Rajarshi

    Rajarshi Guest

    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
    Rajarshi, May 24, 2007
    #1
    1. Advertising

  2. Rajarshi

    Robert Kern Guest

    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
    Robert Kern, May 24, 2007
    #2
    1. Advertising

  3. Rajarshi

    James Stroud Guest

    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:

    py> isinstance(False, int)
    True
    py> isinstance([], int)
    False
    py> bool([])
    False

    James
    James Stroud, May 24, 2007
    #3
  4. > >>> [] == 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
    Raymond Hettinger, May 24, 2007
    #4
  5. Rajarshi

    Paul McGuire Guest

    On May 23, 11:53 pm, 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


    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
    Paul McGuire, May 24, 2007
    #5
  6. 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 && && 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
    Erik Max Francis, May 24, 2007
    #6
  7. Rajarshi

    Tim Roberts Guest

    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?


    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,
    Providenza & Boekelheide, Inc.
    Tim Roberts, May 24, 2007
    #7
  8. 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.
    Steven D'Aprano, May 24, 2007
    #8
  9. Rajarshi

    Rex Turnbull Guest

    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 in
    >> ANY 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
    >>>
    Rex Turnbull, May 24, 2007
    #9
  10. On 2007-05-24, Rex Turnbull <rex@no_spam.dicad.de> wrote:
    > 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 in
    >>> ANY 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 ...
    Grant Edwards, May 24, 2007
    #10
  11. Rajarshi

    Donn Cave Guest

    In article <>,
    Paul McGuire <> wrote:

    > 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!


    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.lang.python/msg/2de5e1c8384c0360

    Donn Cave,
    Donn Cave, May 24, 2007
    #11
  12. 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.lang.python/msg/2de5e1c8384c0360


    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 && && 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.
    Erik Max Francis, May 24, 2007
    #12
  13. Rajarshi

    Dan Bishop Guest

    On May 24, 1:59 am, Tim Roberts <> wrote:
    ....
    > 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.


    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.
    Dan Bishop, May 25, 2007
    #13
  14. Rajarshi

    Steve Holden Guest

    Dan Bishop wrote:
    > On May 24, 1:59 am, Tim Roberts <> wrote:
    > ...
    >> 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.

    >
    > 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 ----------------
    Steve Holden, May 25, 2007
    #14
  15. 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 && && 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
    Erik Max Francis, May 25, 2007
    #15
  16. Rajarshi

    Rajarshi Guest

    Thanks a lot for all the responses
    Rajarshi, May 26, 2007
    #16
  17. Rajarshi

    Donn Cave Guest

    In article <>,
    Erik Max Francis <> wrote:

    > 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.lang.python/msg/2de5e1c8384c0360

    >
    > If so, be sure to click "More options," then "View thread," and then
    > read the responses. There were many reasonable objections to her points.


    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:

    In article <>,
    Paul McGuire <> wrote:

    > 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!


    Donn Cave,
    Donn Cave, May 29, 2007
    #17
  18. 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 && && 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
    Erik Max Francis, May 29, 2007
    #18
  19. Rajarshi

    Donn Cave Guest

    In article <>,
    Erik Max Francis <> wrote:

    > 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.


    "Not that it is of no historical interest" may have been too
    hard to follow, my apologies. I should have said "It may be of
    historical interest ...". After that, you lost me, but I guess
    I'm not going to worry about it.

    Donn Cave,
    Donn Cave, May 29, 2007
    #19
  20. 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 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.


    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.
    Steven D'Aprano, May 29, 2007
    #20
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. André
    Replies:
    3
    Views:
    1,574
  2. DJ
    Replies:
    3
    Views:
    922
  3. trans.  (T. Onoma)
    Replies:
    0
    Views:
    150
    trans. (T. Onoma)
    Sep 25, 2004
  4. trans.  (T. Onoma)
    Replies:
    1
    Views:
    165
    David A. Black
    Sep 25, 2004
  5. Iñaki Baz Castillo
    Replies:
    9
    Views:
    192
    Igor Pirnovar
    Feb 26, 2009
Loading...

Share This Page