In Python 2, we could reassign True
and False
(but not None
), but all three (True
, False
, and None
) were considered builtin variables. However, in Py3k all three were changed into keywords as per the docs.
From my own speculation, I could only guess that it was to prevent shenanigans like this which derive from the old True, False = False, True
prank. However, in Python 2.7.5, and perhaps before, statements such as None = 3
which reassigned None
raised SyntaxError: cannot assign to None
.
Semantically, I don't believe True
, False
, and None
are keywords, since they are at last semantically literals, which is what Java has done. I checked PEP 0 (the index) and I couldn't find a PEP explaining why they were changed.
Are there performance benefits or other reasons for making them keywords as opposed to literals or special-casing them like None
in python2?
Possibly because Python 2.6 not only allowed True = False
but also allowed you to say funny things like:
__builtin__.True = False
which would reset True
to False
for the entire process. It can lead to really funny things happening:
>>> import __builtin__
>>> __builtin__.True = False
>>> True
False
>>> False
False
>>> __builtin__.False = True
>>> True
False
>>> False
False
EDIT: As pointed out by Mike, the Python wiki also states the following under Core Language Changes: