Python nested function variable scope
def outer():
a = 0
b = 1
def inner():
print a
print b
#b = 4
inner()
outer()
With the statement b = 4
commented out, this code outputs 0 1
, just what you'd expect.
But if you uncomment that line, on the line print b
, you get the error
UnboundLocalError: local variable 'b' referenced before assignment
It seems mysterious that the presence of b = 4
might somehow make b
disappear on the lines that precede it. But the text David quotes explains why: during static analysis, the interpreter determines that b is assigned to in inner
, and that it is therefore a local variable of inner
. The print line attempts to print the b
in that inner scope before it has been assigned.
The documentation about Scopes and Namespaces says this:
A special quirk of Python is that – if no
global
statement is in effect – assignments to names always go into the innermost scope. Assignments do not copy data — they just bind names to objects.
So since the line is effectively saying:
_total = _total + PRICE_RANGES[key][0]
it creates _total
in the namespace of recurse()
. Since _total
is then new and unassigned you can't use it in the addition.
Last updated