I just upgraded my Python install, and for the first time have True and False rather than 1 and 0. I was playing around at the command line to test how they work (for instance, "if 9:" and "if True:" both lead to the conditional being executed, but True == 9 -> False, that this would be true was not obvious to me
Note that evaluating to True isn't the same as being equal to True. Would you also expect that [] == None? Both evaluate to False in a boolean context. Or an even better example, would you expect that [1] == [2]? Both of these evaluate to True in a boolean context...
What you should expect is that:
py> bool([]) == bool(None) == False True py> bool([1]) == bool([2]) == True True
"True is True" is True, while "9 is True" is false even though 9 evaluates to True.)
Be careful here. 'is' tests object identity. So "9 is True" would only evaluate to True if 9 is exactly the same object as True. 'is' won't convert anything to a boolean; "x is y" basically translates to "id(x) == id(y)".
why doesn't False = 0 throw the same error?
Backwards compatibility. A lot of modules pre-False and True have code that looks like:
True, False = 1, 0
or
True, False = (1 == 1), (1 == 0)
If assignment to True or False became a syntax error (which it probably should be), it would break all such code.
Also, why doesn't False = 0 make
1 == 20
Instead of False?
You've only rebound the name False in your module's namespace. 1 == 2 executes the int code for equality, which presumably returns one of Py_False or Py_True, not your binding for the name False in your module.
Steve -- http://mail.python.org/mailman/listinfo/python-list