56 votes

Quelle est la meilleure façon de copier une liste?

Quelle est la meilleure façon de copier une liste? Je connais les façons suivantes, laquelle est la meilleure? Ou existe-t-il un autre moyen?

 lst = ['one', 2, 3]

lst1 = list(lst)

lst2 = lst[:]

import copy
lst3 = copy.copy(lst)
 

92voto

Mark Roddy Points 7568

Si vous voulez une copie superficielle (les éléments ne sont pas copiés), utilisez:

 lst2=lst1[:]
 

Si vous souhaitez faire une copie complète, utilisez le module de copie:

 import copy
lst2=copy.deepcopy(lst1)
 

19voto

Andrea Ambu Points 6479

J'utilise souvent:

lst2 = lst1 * 1

Si lst1 il contient d'autres récipients (à l'instar d'autres listes de), vous devez utiliser la propriétédeepcopy à partir de la copie lib comme indiqué par la Marque.


Mise à JOUR: Expliquer propriétédeepcopy

>>> a = range(5)
>>> b = a*1
>>> a,b
([0, 1, 2, 3, 4], [0, 1, 2, 3, 4])
>>> a[2] = 55 
>>> a,b
([0, 1, 55, 3, 4], [0, 1, 2, 3, 4])

Comme vous pouvez le voir seulement changé... Je vais essayer maintenant avec une liste de listes

>>> 
>>> a = [range(i,i+3) for i in range(3)]
>>> a
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
>>> b = a*1
>>> a,b
([[0, 1, 2], [1, 2, 3], [2, 3, 4]], [[0, 1, 2], [1, 2, 3], [2, 3, 4]])

Pas si lisible, permettez-moi de l'imprimer avec une pour:

>>> for i in (a,b): print i   
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
>>> a[1].append('appended')
>>> for i in (a,b): print i

[[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]]

Le voyez-vous? Il annexée à la b[1] aussi, donc b[1] et a[1] est le même objet. Maintenant, essayez avec propriétédeepcopy

>>> from copy import deepcopy
>>> b = deepcopy(a)
>>> a[0].append('again...')
>>> for i in (a,b): print i

[[0, 1, 2, 'again...'], [1, 2, 3, 'appended'], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]]

12voto

Martin Cote Points 12762

Vous pouvez également faire:

 a = [1, 2, 3]
b = list(a)
 

6voto

John Fouhy Points 14700

J'aime faire:

 lst2 = list(lst1)
 

L'avantage par rapport à lst1 [:] est que le même idiome fonctionne pour les dict:

 dct2 = dict(dct1)
 

2voto

Jason Baker Points 56682

Vous pouvez également le faire:

 import copy
list2 = copy.copy(list1)
 

Cela devrait faire la même chose que la copie superficielle de Mark Roddy.

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