IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème de listes de fonctions lambda


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 7
    Points : 10
    Points
    10
    Par défaut Problème de listes de fonctions lambda
    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 :
    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]
    Ainsi, L[0] contient la fonction qui à x associe x^0 soit la fonction constante égale à 1.
    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 :

    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))
    Quand je les évalue, j'obtiens 1 ; 2 ; 4 ; 8 ; 16, comme attendu. Jusque là, tout va bien.

    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)
    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 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).
    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 :
    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))
    Merci d'avance pour vos réponses,

  2. #2
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Il faut passer en paramètre des lambdas la valeur de i, afin qu'elles en conservent une propre référence interne.

    Le temps ronge l'amour comme l'acide.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 7
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Salut.

    Il faut passer en paramètre des lambdas la valeur de i, afin qu'elles en conservent une propre référence interne.

    Je ne suis pas sûr de bien comprendre l'origine du problème (à part que je viens de réaliser que le fait que ça marchait dans la boucle était dû au fait qu'elle était indicée par la même lettre que le i des lambda x**i).
    Mais en tout cas, cela résout mon problème, merci beaucoup

    Edit : bon j'ai fini par tout comprendre, i vaut une certaine valeur en fin de boucle (ici 4) et donc à chaque nouvel incrément de la boucle,la définition de tous les lambda était modifiée.
    Par ailleurs, aurait pu écrire où n est un argument optionnel.
    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/12/2016, 17h06
  2. [Python 3.X] Problème sur le remplissage d'une liste avec des lambdas
    Par TSF.Lyon dans le forum Général Python
    Réponses: 2
    Dernier message: 24/04/2016, 13h02
  3. Réponses: 1
    Dernier message: 24/06/2014, 11h42
  4. Réponses: 2
    Dernier message: 19/04/2010, 17h04
  5. Réponses: 7
    Dernier message: 22/06/2007, 10h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo