I just found this :
a = (None,)
print (a is True)
print (a is False)
print (a == True)
print (a == False)
print (a == None)
print (a is None)
if a : print "hello"
if not a : print "goodbye"
which produces :
False
False
False
False
False
False
hello
So a neither is, nor equals True nor False, but acts as True in an if statement.
Why?
Update :
actually, I've just realized that this isn't as obscure as I thought. I get the same result for a=2, as well (though not for a=0 or a=1, which are considered equal to False and True respectively)
I find almost all the explanations here unhelpful, so here is another try:
The confusion here is based on that testing with "is", "==" and "if" are three different things.
And here comes the important part:
Now maybe this is only more clear in my head, but at least I tried. :)
a
is a one-member tuple, which evaluates to True
. is
test identity of the object, therefore, you get False
in all those test. ==
test equality of the objects, therefore, you get False
again.
in if
statement a __bool__
(or __nonzero__
) used to evaluate the object, for a non-empty tuple it should return True
, therefore you get True
. hope that answers your question.
edit: the reason True
and False
are equal to 1
and 0
respectively is because bool
type implemented as a subclass of int
type.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With