208 votes

Création de fonctions dans une boucle

J'essaie de créer des fonctions à l'intérieur d'une boucle :

functions = []

for i in range(3):
    def f():
        return i

    # alternatively: f = lambda: i

    functions.append(f)

Le problème est que toutes les fonctions finissent par être les mêmes. Au lieu de retourner 0, 1 et 2, les trois fonctions retournent 2 :

print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output:   [2, 2, 2]

Pourquoi cela se produit-il, et que dois-je faire pour obtenir 3 fonctions différentes qui sortent respectivement 0, 1 et 2 ?

0voto

DMeneses Points 139

Pour ajouter à l'excellente réponse de @ Aran-Fey, dans la deuxième solution, vous pouvez également modifier la variable à l'intérieur de votre fonction qui peut être accomplie avec le mot-clé nonlocal :

def f_factory(i):
    def f(offset):
      nonlocal i
      i += offset
      return i  # i is now a *local* variable of f_factory and can't ever change
    return f

for i in range(3):           
    f = f_factory(i)
    print(f(10))

-1voto

Vous pouvez essayer comme ceci :

l=[]
for t in range(10):
    def up(y):
        print(y)
    l.append(up)
l[5]('printing in 5th function')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X