Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #25169

Re: lambda in list comprehension acting funny

References <CADjSo4QvTnGKy_ZYOO5qZu3tSKovwAMGjku4L+RXEkYmwXPz4g@mail.gmail.com> <CADjSo4SeuMJOP_iEM9rjVsFtVh84HaVUtPkUCZGKiEdQBWuerw@mail.gmail.com> <jtj8bt$rl4$1@dough.gmane.org>
Date 2012-07-11 09:36 +0200
Subject Re: lambda in list comprehension acting funny
From Daniel Fetchinson <fetchinson@googlemail.com>
Newsgroups comp.lang.python
Message-ID <mailman.2009.1341992176.4697.python-list@python.org> (permalink)

Show all headers | View raw


>>> funcs = [ lambda x: x**i for i in range( 5 ) ]
>>> print funcs[0]( 2 )
>>>
>>> This gives me
>>> 16
>>>
>>> When I was excepting
>>> 1
>>>
>>> Does anyone know why?
>
>    Just the way Python lambda expressions bind their variable
> references. Inner 'i' references the outer scope's 'i' variable and not
> its value 'at the time the lambda got defined'.
>
>
>> And more importantly, what's the simplest way to achieve the latter? :)
>
>    Try giving the lambda a default parameter (they get calculated and
> have their value stored at the time the lambda is defined) like this:
>    funcs = [ lambda x, i=i: x**i for i in range( 5 ) ]

Thanks a lot!
I worked around it by

def p(i):
    return lambda x: x**i
funcs = [ p(i) for i in range(5) ]

But your variant is nicer (matter of taste of course).

Cheers,
Daniel


-- 
Psss, psss, put it down! - http://www.cafepress.com/putitdown

Back to comp.lang.python | Previous | Next | Find similar | Unroll thread


Thread

Re: lambda in list comprehension acting funny Daniel Fetchinson <fetchinson@googlemail.com> - 2012-07-11 09:36 +0200

csiph-web