J'utilise souvent:
lst2 = lst1 * 1
Si lst1 il contient d'autres conteneurs (comme les autres listes), vous devriez utiliser deepcopy de la bibliothèque de copie comme indiqué par Mark.
MISE À JOUR: Expliquer 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 facile à lire, permettez-moi de l'imprimer avec un 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]]
Vous voyez ça? Il est aussi ajouté à b [1], donc b [1] et a [1] sont exactement le même objet. Maintenant, essayez avec 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]]
Que voulez-vous dire par les éléments ne sont pas copiés? – sheats
Si les éléments sont des objets mutables ils sont passés par référence, vous devez utiliser deepcopy pour vraiment les copier. –
Copier uniquement les références contenues dans la liste. Si un élément de la liste contient une référence à un autre objet, cela ne sera pas copié. 9 fois sur 10 vous avez juste besoin de la copie superficielle. –