Scope and Ambiguous Assignments In Python
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
This code will generate an error:
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
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.
[1] well, you could use the 'global' keyword
Comment via: r/Python