[Tutor] What is the difference between checking false?
eryksun
eryksun at gmail.com
Sun Jun 16 04:23:22 CEST 2013
On Sat, Jun 15, 2013 at 9:30 PM, Jim Mooney <cybervigilante at gmail.com> wrote:
> This is puzzling me. If I check the equality of 0, None, empty
> string, and empty list with False, only zero satisfies the equality.
> But if I use them in a not statement, they all turn out False.
> What gives?
>
> #Using C:\Python33\python.exe on Win 7 in c:\python33\jimprogs
....
> ##Zero is equal to False
> ##None is NOT equal to false
> ##Empty string is NOT equal to False
> ##Empty list is NOT equal to false
> ##
> ##Zero is equal to False
> ##None is equal to false
> ##Empty string is equal to False
> ##Empty list is equal to False
bool subclasses int, with False == 0 and True == 1. None and empty
sequences/mappings aren't *equal* to False. But they are 'falsey' --
i.e. bool(None) is False.
The implementation of UNARY_NOT in CPython is based on the function
PyObject_IsTrue. This function is hard coded for the singletons True,
False, and None -- and otherwise uses either __bool__
(tp_as_number->nb_bool) or __len__ (tp_as_mapping->mp_length or
tp_as_sequence->sq_length). A length of 0 is falsey. If neither
__bool__ nor __len__ is defined, the object defaults to being truthy:
>>> not not object()
True
>>> not object()
False
More information about the Tutor
mailing list