Consider the following two Python snippets:

name='Mary' def print_name(): print name print_name() print name

name='Mary' def print_name(): name='John' print_name() print name

The first will print 'Mary', twice. The second will print 'Mary' once. This happens because while python interprets reads as looking outside the current scope, writes can't be [1] anything but local. So the assignment to 'name' inside 'print_name' creates a new variable that disappears when the function exits.

So now consider:

name='Mary' def print_name(): print name name='John' print_name() print name

Traceback (most recent call last): File "tmp.py", line 5, in <module> print_name() File "tmp.py", line 3, in print_name print name UnboundLocalError: local variable 'name' referenced before assignment

This code will generate an error:The error is because within a function a variable must be either local or global. If it's local, the 'print name' is illegal because 'name' isn't defined yet. If it's global, the 'name="John"' is illegal because you can't assign outside your scope. So python chooses "local" and decides that the 'print name' line is invalid.