Bonjour,
J'ai rencontré un problème avec des listes de fonctions lambda que je ne parviens pas à comprendre
J'ai créé une suite de fonction à partir d'une liste composée de fonctions lambda de la façon suivante :
Ainsi, L[0] contient la fonction qui à x associe x^0 soit la fonction constante égale à 1.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 L=[] for i in range(5): f=lambda x:x**i L=L+[f]
L[1] est l'identité
L[2] la fonction carré
etc.
Et si on fait L[4](2), on évalue la fonction x^4 évaluée en x=2, donc on a 2^4=16.
Pour vérifier que ne je dis pas de bêtises, j'ai mis ça dans une boucle pour tester les L[i](2) pour i variant de 0 à 5 :
Quand je les évalue, j'obtiens 1 ; 2 ; 4 ; 8 ; 16, comme attendu. Jusque là, tout va bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 print("à suivre, f_0(2), f_1(2),... f_4(2) c-a-d 2^0=1 ; 2^1=2 ; ... ; 2^4=16, qu'on fait afficher dans une boucle en faisant varier i") for i in range(5): print("i vaut :",i,",et donc on affiche la valeur de L[",i,"](2)") print(L[i](2))
Sauf que, et c'est là que je n'y comprends plus rien, si j'évalue les mêmes L[i](2), mais en en dehors d'une boucle comme dans le code ci-dessous, il se passe quelque chose : ils sont tous égaux à 16, soit L[4](2)
J'ai si les objets L[i] n'étaient pas les mêmes, quand on tape dans la console, on voit que ce sont des objets différents (pas de fausse copie comme quand je tape K=L pour une liste donc, a priori).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 print("maintenant, on fait afficher les même choses, mais à la différence qu'ils ne sont pas dans une boucle\n et c'est là que je m'y perds !") print("voici affiché L[0](2) qui doit donner 1 : ",L[0](2)) print("voici affiché L[1](2) qui doit donner 2 : ",L[1](2)) print("voici affiché L[2](2) qui doit donner 4 : ",L[2](2)) print("voici affiché L[3](2) qui doit donner 8 : ",L[3](2)) print("voici affiché L[4](2) qui doit donner 16 : ",L[4](2))
J'ai cherché un peu mais parmi tout ce que j'ai découvert à l'heure actuelle ou pu lire dans des tutoriels, je n'ai pas trouvé vraiment de chose qui pourrait expliquer ce problème, c'est pourquoi je vous demande un peu d'aide pour éclairer ma lanterne.
Le code en entier pour tout copier coller d'un coup :Merci d'avance pour vos réponses,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 L=[] for i in range(5): f=lambda x:x**i L=L+[f] print("à suivre, f_0(2), f_1(2),... f_4(2) c-a-d 2^0=1 ; 2^1=2 ; ... ; 2^4=16, qu'on fait afficher dans une boucle en faisant varier i") for i in range(5): print("i vaut :",i,",et donc on affiche la valeur de L[",i,"](2)") print(L[i](2)) print("maintenant, on fait afficher les même choses, mais à la différence qu'ils ne sont pas dans une boucle\n et c'est là que je m'y perds !") print("voici affiché L[0](2) qui doit donner 1 : ",L[0](2)) print("voici affiché L[1](2) qui doit donner 2 : ",L[1](2)) print("voici affiché L[2](2) qui doit donner 4 : ",L[2](2)) print("voici affiché L[3](2) qui doit donner 8 : ",L[3](2)) print("voici affiché L[4](2) qui doit donner 16 : ",L[4](2))
Partager