Dupliqué possible: strong>
fonctionnalité inattendue dans une liste de listes Python P>Je veux faire une liste de listes dans Python, mais apparemment cela ne fonctionne pas, car le changement d'un numéro change plusieurs. Pourquoi est-ce et comment puis-je le réparer? P>
>>> a = [[0]*3]*4 >>> a[0][0] = 1 >>> a [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]]
4 Réponses :
Qu'est-ce que vous avez découvert est un Fall de python classique .
à la place, si vous faites ceci: p> x = [0] * * 3 code> est une liste. Aucun problème là-bas, mais [x] * 4 code> crée une liste avec 4 références à la même liste exacte x code>. Donc, modifier le premier élément, x code> modifie également les autres éléments également. P> In [194]: a[0][0] = 1
In [195]: a
Out[195]: [[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
Stackoverflow a besoin de la possibilité de créer une réponse. C'est un excellent exemple pour pourquoi.
@Jonathanvanasco: Star la question.
J'ai joué la question. Je veux star de la réponse.
Lorsque vous utilisez Pour résoudre ce problème, utilisez un Expression génératrice pour créer votre liste. p> * code> dans la liste, il crée des copies, donc lorsque vous faites a [0] [0] [0] = 1 code> Tout autre copie de la sous-liste. P >
En fait, le problème est que c'est pas i> faire des copies, pas que cela le fait.
n'utilise pas Voir la réponse de nonutbu et de Nneonneo pour une meilleure explication. P> P> * code>. Utilisez la compréhension de la liste et créez comme:
En fait, ce serait bien si * code> copie fait. La bonne chose à dire est que cela fait pas i> faire des copies, seulement des références supplémentaires.
Hmm, j'ai lu votre réponse; agréable. Supprimé la déclaration.
en python, Donc, la solution consiste à utiliser une compréhension de la liste pour créer [x] * n code> crée une nouvelle liste avec n code> références à x code>. Ceci est parfaitement bon d'avoir si x code> est immuable (chaîne, tuple, etc.), mais cela devient plutôt déroutant si x code> est mutable car les modifications apportées à un élément affectent x code>, et semble donc affecter tous les éléments de la liste. n code> nouvelles choses: p> a = [[0]*3 for _ in xrange(4)]
N'utilisez pas
* code>. Cela fait des copies. Utilisez la compréhension de la liste à la place@Marktolonen Yup, j'ai voté pour fermer cette question.