[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.
    0
    1. J'ai bien essayé mais ça ne change rien.
      J'ai les mêmes valeurs pour toutes les lignes.
      Je ne comprends pas....
      0
      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']}}
        0
        1. Modérateur
          Tu as bien dégagé les .append() ?
          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?
            0
            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()
              0
              1. Ah merci!!!
                Je commençais à douter des mes boucles.
                A la prochaine......
                0
              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
                0
            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.
              0
              1. OK merci
                Je testerai ça plus tard.
                0