From a blog post on the History of Python by the Python language designer:
Because you cannot use these as variable or function names anywhere, ever, in any Python program, everyone using Python has to know about all the reserved words in the language, even if they don't have any need for them. For this reason, we try to keep the list of reserved words small, and the core developers hem and haw a lot before adding a new reserved word to the language.
Built-in names are just system provided objects, variables with pre-defined values. You are free to re-define these on a module-by-module or function-by-function basis. Making this (rather large list) of names reserved keywords would go against the above stated philosophy.
Making built-in types and functions reserved keywords would also make it very hard to introduce any new names to that list. Adding to the reserved keyword list has severe consequences for forward compatibility. Imagine adding a color
type to the language; every piece of code ever written to handle images would need to be re-written to avoid using that new keyword.
Quoting from that same post again:
[W]hen we do decide to add a new keyword, we start a deprecation campaign at least one release before the new keyword is introduced, warning developers to choose a different name for their variables.
[...]
There's no such concern for built-ins. Code that happens to use the name of a new built-in as a variable or function name will continue to function (as long as you don't also try to use the new built-in in the same function). While we still try to be conservative with the introduction of new built-ins, at least we don't have to worry about breaking working code by merely adding something to the language.
id
is a great local name in a function. – Esme