Name bindings for inner functions.

Andrea Griffini agriff at tin.it
Sun Oct 29 00:49:36 CEST 2006


trevor_morgan at yahoo.com wrote:
> The following code:
> 
> def functions():
>     l=list()
>     for i in range(5):
>         def inner():
>             return i
>         l.append(inner)
>     return l
> 
> 
> print [f() for f in functions()]
> 
> 
> returns [4,4,4,4,4], rather than the hoped for [0,1,2,3,4].  I presume
> this is something to do with the variable i getting re-bound every time
> we go through the loop, or something, but I'm not sure how to fix this.

The problem is that "i" inside the function is indeed
the same variable for all the functions (the one you're
using for looping).

If you want a different variable for each function
you can use the somewhat ugly but idiomatic

def functions():
     l=list()
     for i in range(5):
         def inner(i=i):
             return i
         l.append(inner)
     return l

this way every function will have its own "i" variable,
that is initialized with the value of the loop variable
when executing the "def" statement.

Andrea



More information about the Python-list mailing list