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:

Jealousy In Polyamory Isn't A Big Problem And I'm Tired Of Being Gaslit By Big Self-Help

The nuance is in the post, guys

via Thing of Things July 18, 2024

Trust as a bottleneck to growing teams quickly

non-trust is reasonable • trust lets collaboration scale • symptoms of trust deficit • how to proactively build trust

via benkuhn.net July 13, 2024

Coaching kids as they learn to climb

Helping kids learn to climb things that are at the edge of their ability The post Coaching kids as they learn to climb appeared first on Otherwise.

via Otherwise July 10, 2024

more     (via openring)