SeanMon wrote:
I was playing around with Python functions returning functions and the
scope rules for variables, and encountered this weird behavior that I
can't figure out.
Why does f1() leave x unbound, but f2() does not?
def f1():
x = 0
def g():
x += 1
return x
return g1
def f2():
x = []
def g():
x.append(0)
return x
return g
a = f1()
b = f2()
a() #UnboundLocalError: local variable 'x' referenced before
assignment
b() #No error, [0] returned
b() #No error, [0, 0] returned
Your example is more complex than needed. The symptom doesn't need a
function closure.
>>> def g():
... x += 1
... return x
...
>>> g()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in g
UnboundLocalError: local variable 'x' referenced before assignment
>>> def f():
... x.append(0)
... return x
...
>>> x = [3,5]
>>> f()
[3, 5, 0]
>>>
The difference between the functions is that in the first case, x is
reassigned; therefore it's a local. But it's not defined before that
line, so you get the ref before assign error.
In the second case, append() is an in-place operation, and doesn't
create a local variable.
DaveA
--
http://mail.python.org/mailman/listinfo/python-list