Yes it should be listed somewhere, now I get it. Thanks Arnaud. -- Elias
On Feb 18, 1:47 pm, Arnaud Delobelle <arno...@googlemail.com> wrote: > lallous <elias.bachaal...@gmail.com> writes: > > Hello, > > > I am still fairly new to Python. Can someone explain to me why there > > is a difference in f and g: > > > def make_power(n): > > return lambda x: x ** n > > > # Create a set of exponential functions > > f = [lambda x: x ** n for n in xrange(2, 5)] > > g = [make_power(n) for n in xrange(2, 5)] > > > print f[0](3), f[1](3) > > print g[0](3), g[1](3) > > > I expect to have "f" act same like "g". > > > Thanks > > It's a FAQ! Except I don't think it's in the official Python FAQ, but > it ought to be. > > The reason (very quickly) is that each time you call make_power() you > create a new name 'n' which is bound to a different value each time, > whereas in f: > > [lambda x: x ** n for n in xrange(2, 5)] > > The 'n' is the same name for each of the lambda functions and so is > bound to the same value, which by the end of the loop is 4. So each of > the lambdas in the list f is the same as: > > lambdsa x; x**4 > > after the end of the list comprehension. > > The usual fix for this is to change f to: > > f = [lambda x, n=n: x ** n for n in xrange(2, 5)] > > I'll let you think why this works. > > HTH > > -- > Arnaud -- http://mail.python.org/mailman/listinfo/python-list