Pour ajouter un peu de clarté (au moins dans mon esprit)
def makeFun(i): return lambda: i
a = [makeFun(i) for i in range(10)]
b = [lambda: i for i in range(10)]
utilise un makeFun (i) qui est une fonction avec un argument. B utilise lambda: i qui est une fonction sans arguments.Le i utilise est très différente de la précédente
Pour a et b égale, nous pouvons faire les deux fonctions à utiliser aucun argument:
def makeFun(): return lambda: i
a = [makeFun() for i in range(10)]
b = [lambda: i for i in range(10)]
Maintenant, les deux fonctions utilisent le global i
>>> a[2]()
9
>>> b[2]()
9
>>> i=13
>>> a[2]()
13
>>> b[2]()
13
Ou (plus utile) faire à la fois utiliser un argument:
def makeFun(x): return lambda: x
a = [makeFun(i) for i in range(10)]
b = [lambda x=i: x for i in range(10)]
J'ai délibérément changé i avec x où la variable est locale. maintenant:
>>> a[2]()
2
>>> b[2]()
2
Succès!
Ok, maintenant c'est logique pour moi. Merci! – Anssi