2010-03-29 6 views
19

Salut Je veux copier une liste 2D, de sorte que si je modifie 1 liste, l'autre n'est pas modifiée.Copie de listes 2D en python

Pour 1 liste D, je fais ceci:

a = [1,2] 
b = a[:] 

Et maintenant, si je modifie b, un est pas modifié.

Mais cela ne fonctionne pas pour la liste 2D:

a = [[1,2],[3,4]] 
b = a[:] 

Si je modifie b, a se modifie aussi.

Comment résoudre ce problème?

+3

A beaucoup du temps où les gens utilisateur listes imbriquées et ont besoin de les copier de cette façon, ils veulent vraiment utiliser 'numpy'. –

Répondre

34

Pour une solution plus générale qui fonctionne quel que soit le nombre de dimensions, utilisez copy.deepcopy():

import copy 
b = copy.deepcopy(a) 
+0

Bien que dans la plupart des cas, je dirais probablement 'de copie l'importation deepcopy' depuis un conflit de nom est peu probable, et il semble plus agréable. ;) – Amber

+1

@Dav, vous faites un point valide. Je préfère toujours importer des modules afin d'éviter les conflits de noms au lieu de gérer les fonctions au cas par cas. :) –

+0

Notez que cela copiera également les éléments réels dans les listes. – FogleBird

35
b = [x[:] for x in a] 
+4

+1 selon le cas. Personnellement, j'aime éviter copier/deepcopy (très très rarement eu un cas d'utilisation valide pour eux dans la vraie vie, la même chose peut être dite pour une liste avec plus de 2 dimensions imo) – ChristopheD