6
votes

Python Liste des listes

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]]


2 commentaires

N'utilisez pas * . Cela fait des copies. Utilisez la compréhension de la liste à la place


@Marktolonen Yup, j'ai voté pour fermer cette question.


4 Réponses :


8
votes

Qu'est-ce que vous avez découvert est un Fall de python classique .

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>

à la place, si vous faites ceci: p>

In [194]: a[0][0] = 1

In [195]: a
Out[195]: [[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]


3 commentaires

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.



-1
votes

Lorsque vous utilisez * dans la liste, il crée des copies, donc lorsque vous faites a [0] [0] [0] = 1 Tout autre copie de la sous-liste.

Pour résoudre ce problème, utilisez un Expression génératrice pour créer votre liste.


1 commentaires

En fait, le problème est que c'est pas faire des copies, pas que cela le fait.



1
votes

n'utilise pas * . Utilisez la compréhension de la liste et créez comme: XXX

Voir la réponse de nonutbu et de Nneonneo pour une meilleure explication.


2 commentaires

En fait, ce serait bien si * copie fait. La bonne chose à dire est que cela fait pas faire des copies, seulement des références supplémentaires.


Hmm, j'ai lu votre réponse; agréable. Supprimé la déclaration.



4
votes

en python, [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.

Donc, la solution consiste à utiliser une compréhension de la liste pour créer n code> nouvelles choses: p>

a = [[0]*3 for _ in xrange(4)]


0 commentaires