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 sur le remplissage d'une liste avec des lambdas [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Problème sur le remplissage d'une liste avec des lambdas
    Bonjour,

    je débute en Python, et je me suis retrouvé face à un problème que je ne comprends pas:
    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
    16
    17
    def __BuildPMain(self, k):
            # produit un résultat inattendu !
            #s = []
            #for i in range(4):
            #    s += [lambda x : k.SetMainDummy(i, int(x))]
     
            # pas mieux... identique à l'essai précédent
            #s = [None, None, None, None]
            #for i in range(4):
            #    s[i] = lambda x : k.SetMainDummy(i, int(x))
     
            # enfin, cela fonctionne correctement, mais pourquoi ???
            s =[lambda x : k.SetMainDummy(0, int(x)),
                lambda x : k.SetMainDummy(1, int(x)),
                lambda x : k.SetMainDummy(2, int(x)),
                lambda x : k.SetMainDummy(3, int(x))]
            return s
    Plus précisément, avec les 2 premières solutions, les appels de s[n], quel que soit n, se comportent tous comme s[3], alors que si je remplis s manuellement, on a bien des s[0] ... s[3] différents

    Quelqu'un a une idée ?

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par TSF.Lyon Voir le message
    Quelqu'un a une idée ?
    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> fcts = []
    >>> for x in range(3):
    ...     fcts.append(lambda: print(x))
    ...
    >>> for f in fcts: f()
    ...
    2
    2
    2
    Le "x" utilisé dans la fonction lambda sera le "x" global et donc le dernier.
    Il faut geler la valeur dans les paramètres d'appels:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> fcts = []
    >>> for x in range(3):
    ...     fcts.append(lambda x=x: print(x))
    ...
    >>> for f in fcts: f()
    ...
    0
    1
    2
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Merci pour votre réponse, toutefois, vous noterez que la variable de boucle i n'est pas le paramètre x de la lambda soit dans le cas suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fcts = []
    for i in range(3):
      fcts.append(lambda x: print('{} : {}'.format(i, x)))
    si, comme vous l'indiquez, j'essaie de geler le x:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fcts = []
    for i in range(3):
      fcts.append(lambda x=x: print('{} : {}'.format(i, x)))
    Je me retrouve immédiatement avec l'erreur suivante: "NameError: name 'x' is not defined"

    edit:
    Toutefois, votre réponse m'a mis sur la bonne piste, effectivement, le fait de donner une valeur par défaut à un des paramètres de la lambda (ce que vous appelez "geler la variable", mais ce n'est pas très clair) est la bonne solution soit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fcts = []
    for i in range(3):
      fcts.append(lambda x, k=i: print('{} : {}'.format(k, x)))
    qui a le comportement attendu

    Merci !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/11/2014, 08h18
  2. Problème sur le groupement d'une liste (d'un agenda)
    Par fredflo dans le forum SharePoint
    Réponses: 4
    Dernier message: 05/07/2013, 08h48
  3. Réponses: 1
    Dernier message: 08/08/2012, 14h52
  4. Réponses: 4
    Dernier message: 17/07/2011, 22h31
  5. [MFC] creer une liste avec des check????
    Par ginounet dans le forum MFC
    Réponses: 4
    Dernier message: 16/06/2004, 11h47

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