I have a simple example that is confusing me, concerning local and global scopes in functions.
print(a) # Error: local variable 'a' referenced before assignment
If I comment the first print statement it runs fine. The local "a" takes precedence over the global "a" and hence 2nd print gives 2.
If I comment the a=2, then the print statements in the local scope see the global scope and print a=1.
What is confusing me is that when I run the entire function python throws an error: "local variable 'a' referenced before assignment"
What I was expecting was that the first print(a) produces 1 and the second print(a) produces 2.
I'm struggling to tease this apart. I examined locals() inside the func() so the first print function sees no local but it does see a global a. I'm really a bit lost and would appreciate someone explaining why it appears that the combination errors when the individual bits work fine.
When you make an assignment to
a variable in a scope, it becomes local to that scope and shadows any similarly named variable in the outer scope. Since Python's scoping is static, wheter
a is local or global is determined at compile time and that's why, when it comes to
func(), Python sees
a is assigned within the function body and treats it as a local variable throughout the entire function. Note at this point it's irrelevant where in the function body this happen exactly - it's sufficient for Python to just know it does. When you try to
print(a) before local
a has been really assigned a value within that function, you will face an error. When you comment out
a = 2 however, then local
a is gone, and Python sees one from global scope, therefore
print(a) executes successfully as the
a at that point is assigned a value.