Why were True and False changed to keywords in Python 3

Snakes and Coffee picture Snakes and Coffee · Aug 5, 2013 · Viewed 7.7k times · Source

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?

Answer

devnull picture devnull · Aug 5, 2013

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:

  • Make True and False keywords.
    • Reason: make assignment to them impossible.