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