x = 1 # make a global module variable
def f(): print x # try to print the global ... for j in range(100): if q > 3: x=4
Any variable assigned in a function is local to that function, unless it is specifically declared global. Since a value is bound to x as the last statement of the function body, the compiler assumes that x is local. Consequently the “print x” statement attempts to print an uninitialized local variable and will trigger aUnboundLocalError (or in earlier Python versions, a NameError).
The solution is to insert an explicit global declaration at the start of the function:
def f(): global x print x # try to print the global ... for j in range(100): if q > 3: x=4
In this case, all references to x are interpreted as references to the x from the module namespace.
Note that the global declarations must be placed at the beginning of the function, and that it affects all uses of the variable inside the function.