How to generate a list of different lambda functions with a list?

This question is overtaken from the original application, including callback functions for the Tkinter buttons. This is one line that illustrates the behavior.

lambdas = [lambda: i for i in range(3)]

if you then try to call generated lambda functions lambdas[0](), lambdas[1]()and lambdas[2]()all return 2.

The desired behavior was to have lambdas[0]()return 0, lambdas[1]()return 1, lambdas[2])()return 2.

I see that the index variable is interpreted by reference. The question is how to rephrase so that it is processed by value.

+4
source share
4 answers

functools.partial , :

from functools import partial
lambdas = [partial(lambda x: x, i) for i in range(3)]

lambda x: x - , , , .

+2

, i . lambda , i :

In [110]: lambdas = [lambda i=i: i for i in range(3)]

In [111]: for lam in lambdas:
   .....:       print(lam())
   .....: 
0
1
2

i , Python . - i, . lambda 2, for lambdas.


- , , , , .

def make_func(i):
    return lambda: i

lambdas = [make_func(i) for i in range(3)]
for lam in lambdas:
    print(lam())

0
1
2

, lam() , i lambda function body , Python i make_func. - , lam, make_func . - , make_func, , , i.


mkrieger1, functools.partial:

lambdas = [functools.partial(lambda x: x, i) for i in range(3)]
+5

, , i .

, , i. , i 2, , i for.


i . , , ,

>>> lambdas = [lambda i=i: i for i in range(3)]
>>> lambdas[0]()
0
>>> lambdas[1]()
1
>>> lambdas[2]()
2

lambda i=i: i i, i. , , i , , .

, ,

>>> lambdas = [lambda t=i: t for i in range(3)]

, map, , , ,

>>> lambdas = map(lambda x: lambda: x, range(3))
>>> lambdas[0]()
0
>>> lambdas[1]()
1
>>> lambdas[2]()
2

lambda x: lambda: x , x , , x.

. map . .

+4

Ahhh, Googling ( , ). :

lambdas = [lambda i=i: i for i in range(3)]

-1

All Articles