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

Reply via email to