An identifier occurring as an atom is a reference to a local, global
or built-in name binding. If a name is assigned to anywhere in a code
block (even in unreachable code), and is not mentioned in a
global statement in that code block, then it refers to a local
name throughout that code block. When it is not assigned to anywhere
in the block, or when it is assigned to but also explicitly listed in
a global statement, it refers to a global name if one exists,
else to a built-in name (and this binding may dynamically change).
When the name is bound to an object, evaluation of the atom yields
that object. When a name is not bound, an attempt to evaluate it
raises a NameError exception.
Private name mangling:
__spam occurring in a class named
Ham will be
_Ham__spam. This transformation is independent
of the syntactical context in which the identifier is used. If the
transformed name is extremely long (longer than 255 characters),
implementation defined truncation may happen. If the class name
consists only of underscores, no transformation is done.