Why am I getting an UnboundLocalError when the variable has a value?
--------------------------------------------------------------------

New Python programmers are often surprised when they get this error in
previously working code when they modify it by adding an assignment statement
somewhere in the body of a function.

This code:

   >>> x = 10
   >>> def bar():
   ...     print x
   >>> bar()
   10

works, but this code:

   >>> x = 10
   >>> def foo():
   ...     print x
   ...     x += 1

results in an UnboundLocalError:

   >>> foo()
   Traceback (most recent call last):
     ...
   UnboundLocalError: local variable 'x' referenced before assignment

This is because when you make an assignment to a variable in a scope, that
variable becomes local to that scope and shadows any similarly named variable
in the outer scope.  Since the last statement in foo assigns a new value to
``x``, the compiler recognizes it as a local variable.  Consequently when the
earlier ``print x`` attempts to print the uninitialized local variable and
an error results.

In the example above you can access the outer scope variable by declaring it
global:

   >>> x = 10
   >>> def foobar():
   ...     global x
   ...     print x
   ...     x += 1
   >>> foobar()
   10

This explicit declaration is required in order to remind you that (unlike the
superficially analogous situation with class and instance variables) you are
actually modifying the value of the variable in the outer scope:

   >>> print x
   11

In Python3, you can do a similar thing in a nested scope using the
:keyword:`nonlocal` keyword:

.. doctest::
   :options: +SKIP

   >>> def foo():
   ...    x = 10
   ...    def bar():
   ...        nonlocal x
   ...        print x
   ...        x += 1
   ...    bar()
   ...    print x
   >>> foo()
   10
   11
