Jp Calderone wrote: > On Thu, 06 Oct 2005 16:18:15 -0400, Joshua Ginsberg > <[EMAIL PROTECTED]> wrote: >>So this part makes total sense to me: >> >>>>> d = {} >>>>> for x in [1,2,3]: >>... d[x] = lambda y: y*x >>... >>>>> d[1](3) >>9 >> >>Because x in the lambda definition isn't evaluated until the lambda is >>executed, at which point x is 3. >> >>Is there a way to specifically hard code into that lambda definition >>the contemporary value of an external variable? In other words, is >>there a way to rewrite the line "d[x] = lambda y: y*x" so that it is >>always the case that d[1](3) = 3? > > There are several ways, but this one involves the least additional > typing: > > >>> d = {} > >>> for x in 1, 2, 3: > ... d[x] = lambda y, x=x: y * x > ... > >>> d[1](3) > 3 > > Who needs closures, anyway? :) >
Just for completeness, here's the lambda free closure version: >>> def timesx_factory(x): def timesx(y): return y * x return timesx >>> d = dict((x, timesx_factory(x)) for x in range(1,4)) >>> d[1](3) 3 >>> d[2](3) 6 >>> -- http://mail.python.org/mailman/listinfo/python-list