Name bindings for inner functions.

trevor_morgan at yahoo.com trevor_morgan at yahoo.com
Sat Oct 28 21:41:48 EDT 2006


Thanks, that's exactly what I needed.
Andrea Griffini wrote:
> 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