Lambda evaluation

Duncan Booth duncan.booth at invalid.invalid
Thu Oct 6 17:03:49 EDT 2005


Jp Calderone wrote:

> On Thu, 06 Oct 2005 16:18:15 -0400, Joshua Ginsberg
> <listspam at flowtheory.net> 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
>>> 



More information about the Python-list mailing list