Velocity Reviews > Re: Lambda evaluation

# Re: Lambda evaluation

Jp Calderone
Guest
Posts: n/a

 10-06-2005
On Thu, 06 Oct 2005 16:18:15 -0400, Joshua Ginsberg <> 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?

Jp

Duncan Booth
Guest
Posts: n/a

 10-06-2005
Jp Calderone wrote:

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