Python scope: "UnboundLocalError: local variable 'c' referenced before assignment"

Within a function, variables that are assigned to are treated as local variables by default. To assign to global variables, use the global statement:

def g(n):
    global c
    c = c + n

This is one of the quirky areas of Python that has never really sat well with me.


Global state is something to avoid, especially needing to mutate it. Consider if g() should simply take two parameters or if f() and g() need to be methods of a common class with c an instance attribute

class A:
    c = 1
    def f(self, n):
        print self.c + n
    def g(self, n):
        self.c += n

a = A()
a.f(1)
a.g(1)
a.f(1)

Outputs:

2
3

Errata for Greg's post:

There should be no before they are referenced. Take a look:

x = 1
def explode():
    print x # raises UnboundLocalError here
    x = 2

It explodes, even if x is assigned after it's referenced. In Python variable can be local or refer outer scope, and it cannot change in one function.

Tags:

Python

Scope