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:

On Writing A Lot Of Words

All the writing advice I have

via Thing of Things September 5, 2024

Two 19th-century missionary memoirs in China

Life for an American family in 1860s China The post Two 19th-century missionary memoirs in China appeared first on Otherwise.

via Otherwise August 24, 2024

When it gets complicated is when your impact is spiking

You’ve started a project or company. Great idea, great team, you’re cranking away. Build a prototype, work on acquiring the key partnerships, figure out launch planning, get a few initial users… simple enough right?

via Home August 19, 2024

more     (via openring)