Scope and Ambiguous Assignments In Python

March 21st, 2011
python, tech
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

Recent posts on blogs I like:

Bad Therapy Review: Privilege

Gently raised in Park Slope

via Thing of Things May 7, 2024

How bad is alcohol?

Unfortunately we landed on a pretty bad drug as a default. The post How bad is alcohol? appeared first on Otherwise.

via Otherwise May 6, 2024

Clarendon Postmortem

I posted a postmortem of a community I worked to help build, Clarendon, in Cambridge MA, over at Supernuclear.

via Home March 19, 2024

more     (via openring)