13.2 The global Statement
The global
statement is the only thing
that's remotely like a declaration statement in
Python. It's not a type or size declaration, though,
it's a namespace declaration. It tells Python that a
function plans to change global names—names that live in the
enclosing module's scope (namespace).
We've talked about global in
passing already; as a summary:
global means "a name at the
top-level of the enclosing module file." Global names must be declared only if they are assigned in a function. Global names may be referenced in a function without being declared.
The global statement is just the keyword global,
followed by one or more names separated by commas. All the listed
names will be mapped to the enclosing module's scope
when assigned or referenced within the function body. For instance:
X = 88 # Global X
def func( ):
global X
X = 99 # Global X: outside def
func( )
print X # Prints 99
We've added a global declaration
to the example here, such that the X inside the
def now refers to the X outside
the def; they are the same variable this time.
Here is a slightly more involved example of global
at work:
y, z = 1, 2 # Global variables in module
def all_global( ):
global x # Declare globals assigned.
x = y + z # No need to declare y,z: LEGB rule
Here, x, y, and
z are all globals inside the function
all_global. y and
z are global because they aren't
assigned in the function; x is global because it
was listed in a global statement to map it to the
module's scope explicitly. Without the
global here, x would be
considered local by virtue of the assignment.
Notice that y and z are not
declared global; Python's LEGB lookup rule finds
them in the module automatically. Also notice that
x might not exist in the enclosing module before
the function runs; if not, the assignment in the function creates
x in the module.
If you want to change names outside functions, you have to write
extra code (global statements); by default, names
assigned in functions are locals. This is by design—as is
common in Python, you have to say more to do the
"wrong" thing. Although there are
exceptions, changing globals can lead to well-known software
engineering problems: because the values of variables are dependent
on the order of calls to arbitrarily distant functions, programs can
be difficult to debug. Try to minimize use of globals in your code.
|