2 votes

La liste/matrice n'enregistre pas les valeurs correctes

J'ai un problème bizarre avec un devoir que j'ai reçu. Nous sommes censés implémenter une classe de matrice. Ce n'est pas si difficile, mais Python ne fait pas ce que je lui dis de faire. Mais je suis sûr qu'il y a une explication.

Le problème est que, dans le code suivant, j'essaie d'enregistrer des valeurs (fournies dans une liste) dans une matrice.

class simplematrix:
    matrix = [[]]
    def __init__(self, * args):
       lm = args[0]
       ln = args[1]
       values = args[2]
       self.matrix = [[0]*ln]*lm

       for m in range(lm):
           for n in range(ln):
               self.matrix[m][n] = values[(m*ln)+n]

vals = [0,1,2,3,4,5]
a = simplematrix(2,3,vals)

Lorsque j'essaie d'imprimer la matrice, je m'attends à obtenir [[0,1,2], [3,4,5]], ce que j'obtiens si je l'exécute à la main, sur une feuille de papier. Si j'imprime la matrice depuis Python, j'obtiens [[3,4,5], [3,4,5]] à la place. Quelqu'un peut-il me dire pourquoi Python agit de la sorte, ou si j'ai fait une erreur stupide quelque part ? :)

2voto

NPE Points 169956

Le problème est dans [[0]*ln]*lm . Le résultat est constitué de lm références à la même liste Ainsi, lorsque vous modifiez une ligne, toutes les lignes semblent être modifiées.

Essayez :

self.matrix = [[0]*ln for i in xrange(lm)]

2voto

TartanLlama Points 1461

Les réponses de Tim et aix corrigent votre erreur, mais cette étape n'est même pas nécessaire, vous pouvez faire tout cela en une ligne en utilisant une liste de compréhension :

self.matrix = [[values[m*ln+n] for n in range(ln)] for m in range(lm)]

Vous pouvez aussi dire :

vals = range(6)

par rapport à ce que vous avez déjà. Cela permet de mettre de l'ordre dans votre code et de le rendre plus pythique.

1voto

Tim Pietzcker Points 146308

Le problème est que self.matrix = [[0]*ln]*lm ne vous donne pas une liste de lm des sous-listes distinctes, mais une liste de lm références à la même liste unique [[0]*ln] .

Essayez

self.matrix = [[0]*ln for i in range(lm)]

(Si vous êtes sur Python 2, utilisez xrange(lm) à la place).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X