Peter Hansen wrote:
I should point out a terminological inexactitude here: False is not a statement, it's an identifier. As Peter pointed out, that identifier can exist in several different namespaces, leading to your initial confusion.drs wrote:
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 -- "True is True" is True, while "9 is True" is false
even though 9 evaluates to True.)
What do you mean by "9 evalutes to True"? That's not the case. bool(9) does evaluate to True, and that's effectively what "if 9:" is doing...
Anyhow, in doing my tests, I accidentally
typed
False = 0
rather than
False == 0
and I lost the False statement.
Note, however, that the 2.4 documentation does actually list True and False as constants (along with None) in section 2.5 of the Library Reference manual.
To get it back, you should do "del False". Remarkably, this actually just removes the local name False that you created which was "shadowing" the builtin name, allowing the builtin name (which you didn't change) to be seen again.
Note that this name you are creating is actually *local* to the module you are in, which at the interactive prompt is called __main__. Thus you are not changing False from the point of view of any other module, or of the Python internals. They are (for the most part) still getting it from the builtin module.
which seems to put False back to False, but this seems weird.
1 = 0
throws an error (can't assign to literal), why doesn't False = 0 throw the
same error?
False is not a constant, it's merely a name. 1 and 0 are constants. You can't change a constant, but you *can* "rebind" a name (that is, attach it to something else). That's all you're doing here.
Also, why doesn't False = 0 make
1 == 2
0 Instead of False?
Because such comparisons are all effectively doing a bool() which continues to return the builtin False.
Sadly, the builtin False and True can actually be overwritten (unlike None, which starting from 2.4 really *is* a constant):
$ python
Python 2.4 (#1, Dec 4 2004, 20:10:33)
[GCC 3.3.3 (cygwin special)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> None = 42
SyntaxError: assignment to None
>>> True = 33
>>> True
33
>>> __builtins__.True
True
>>> __builtins__.True = 42
>>> True
33
>>> del True
>>> True
42
>>>
Of course, even though you can change True's value, you can't make a comparison return __builtins__.True:
>>> None is None True >>> (None is None) + 1 2 >>>
Here the comparison is returning the Python object to which __builtins__.True initially refers.
when-i-tell-you-three-times-it-is-forty-true-ly y'rs - steve -- Steve Holden http://www.holdenweb.com/ Python Web Programming http://pydish.holdenweb.com/ Holden Web LLC +1 703 861 4237 +1 800 494 3119 -- http://mail.python.org/mailman/listinfo/python-list