[Python]

Résolu
Bonjour,
J'ai un souci avec la méthode append().
Voici mon code :
print self.list_num_line_sharp[f], self.mat
self.mat2[self.list_num_line_sharp[f]].append(self.mat)
print self.mat2

Ces lignes sont imbriquées dans une boucle et voici ce qu'affiche le terminal :
20 {'vb': ['0.7'], 'vc': ['1'], 'vs': ['0'], 've': ['0']}
{20: [{'vb': ['0.7'], 'vc': ['1'], 'vs': ['0'], 've': ['0']}]}

130 {'vb': ['0.75'], 'vc': ['1'], 'vs': ['0'], 've': ['0']}
{130: [{'vb': ['0.75'], 'vc': ['1'], 'vs': ['0'], 've': ['0']}],
20: [{'vb': ['0.75'], 'vc': ['1'], 'vs': ['0'], 've': ['0']}]}

Je voudrais savoir pourquoi il me remplace la ligne commençant par '20:' par les valeurs de la ligne '30:'.
Moi je veux qu'à chaque fois il ajoute la ligne 'self.mat' et qu'il y associe la valeur 'self.list_num_line_sharp[f]'.

Où est mon erreur?
Merci

7 réponses

  1. Modérateur
    Pour ajouter une valeur à un dictionnaire, il ne faut pas utiliser append.

    Il ne faut pas faire:
    mondico[cle].append(valeur)

    mais:
    mondico[cle] = valeur

    La clé sera automatiquement créée dans le dictionnaire.
    1. J'ai bien essayé mais ça ne change rien.
      J'ai les mêmes valeurs pour toutes les lignes.
      Je ne comprends pas....
      1. Modérateur
        Je procède comme ça:
        mat2 = {}
        
        cle = 20; mat = {'vb': ['0.7'], 'vc': ['1'], 'vs': ['0'], 've': ['0']}
        print cle, mat
        mat2[cle] = mat
        print mat2
        
        print '-----'
        cle = 130; mat = {'vb': ['0.75'], 'vc': ['1'], 'vs': ['0'], 've': ['0']}
        print cle, mat
        mat2[cle] = mat
        print mat2


        Ce qui donne:
        20 {'vb': ['0.7'], 'vc': ['1'], 'vs': ['0'], 've': ['0']}
        {20: {'vb': ['0.7'], 'vc': ['1'], 'vs': ['0'], 've': ['0']}}
        -----
        130 {'vb': ['0.75'], 'vc': ['1'], 'vs': ['0'], 've': ['0']}
        {130: {'vb': ['0.75'], 'vc': ['1'], 'vs': ['0'], 've': ['0']}, 20: {'vb': ['0.7'
        ], 'vc': ['1'], 'vs': ['0'], 've': ['0']}}
        1. J'y comprends rien.
          J'ai viré les append(), mais ça ne marche pas.
          Le fait que le dictionnaire "mat" soit créé dans une boucle ne pose pas de problème?
          1. Modérateur
            Le fait que le dictionnaire "mat" soit créé dans une boucle ne pose pas de problème?

            A priori non, mais en fait, quand tu ajoute self.mat, tu ajoute la référence à self.mat à ton dictionnaire.

            Tu dois ajouter une copie:
            self.mat2[self.list_num_line_sharp[f]] = self.mat.copy()
            1. Ah merci!!!
              Je commençais à douter des mes boucles.
              A la prochaine......
            2. @Utilisateur anonymeSeb si tu es encore là.....
              Juste une petite question.
              Comment on fait pour cocher un checkbutton par défaut?
              Je voudrais que dès l'ouverture, certains soient cochés.
              Merci
          2. Modérateur
            Comment on fait pour cocher un checkbutton par défaut?

            mmm.. de mémoire il faut faire un .set(1) sur la variable tkinter attachée au checkbutton.
            1. OK merci
              Je testerai ça plus tard.