# Python nested function variable scope

```
def outer():
    a = 0
    b = 1

    def inner():
        print a
        print b
        #b = 4

    inner()

outer()
```

With the statement `b = 4` commented out, this code outputs `0 1`, just what you'd expect.

But if you uncomment that line, on the line `print b`, you get the error

```
UnboundLocalError: local variable 'b' referenced before assignment
```

It seems mysterious that the presence of `b = 4` might somehow make `b` disappear on the lines that precede it. But the text David quotes explains why: during static analysis, the interpreter determines that b is assigned to in `inner`, and that it is therefore a local variable of `inner`. The print line attempts to print the `b` in that inner scope before it has been assigned.

[The documentation about Scopes and Namespaces](http://docs.python.org/tutorial/classes.html#python-scopes-and-namespaces) says this:

> A special quirk of Python is that – if no `global` statement is in effect – **assignments to names always go into the innermost scope**. Assignments do not copy data — they just bind names to objects.

So since the line is effectively saying:

```
_total = _total + PRICE_RANGES[key][0]
```

it creates `_total` in the namespace of `recurse()`. Since `_total` is then new and unassigned you can't use it in the addition.

{% embed url="https://stackoverflow.com/questions/5218895/python-nested-functions-variable-scoping" %}
