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, substack

Recent posts on blogs I like:

AI risk is not a Pascal's wager

In the 17th century, the mathematician Blaise Pascal devised the idea of Pascal’s Wager.

via Thing of Things April 6, 2026

Microfictions

A few microfictions, very much inspired by Quiet Pine Trees. I hope to add more over time. No LLMs.

via Evan Fields March 27, 2026

Daycares and the Brown School

As someone in Somerville I notice that there are quite high prices regarding childcare. The average family in Somerville pays $1,100 to $3,500 for daycare per month, and I want to make the costs more affordable. I have also noticed that housing is quite …

via Lily Wise's Blog Posts March 22, 2026

more     (via openring)