Le résultat de l'exécution avec Python 3.8.3.
Parfois, je veux faire une copie de la liste, changer les valeurs et la comparer à l'original. Dans ce cas, vous devez écrire en utilisant la méthode deepcopy du module de copie comme suit.
Lorsque la liste est unidimensionnelle, vous pouvez la copier avec deepcopy ()
, slice, list ()
, etc.
list_copy_example_1.py
import copy
list_1 = [0,1,2]
list_2 = copy.deepcopy(list_1) #deepcopy()utilisation
list_3 = list_1[:] #Découpez la liste d'origine
list_4 = list(list_1) #list()utilisation
list_2[0] = 1000
list_3[0] = 2000
list_4[0] = 3000
print(list_1)
print(list_2)
print(list_3)
print(list_4)
La sortie ressemble à ceci.
[0, 1, 2]
[1000, 1, 2]
[2000, 1, 2]
[3000, 1, 2]
Si la liste est bidimensionnelle (ou supérieure), vous pouvez la copier avec deepcopy ()
. Le découpage et list ()
ne fonctionnent pas (voir ci-dessous).
list_copy_example_2.py
import copy
list_1 = [[0,1,2], [3,4,5]]
list_2 = copy.deepcopy(list_1)
list_2[0][0] = 1000
print(list_1)
print(list_2)
La sortie ressemble à ceci.
[[0, 1, 2], [3, 4, 5]]
[[1000, 1, 2], [3, 4, 5]]
Puisque la référence à la liste elle-même est copiée, la valeur de la liste d'origine est également modifiée.
anti_pattern_1.py
#=Remplacer par
list_1 = [0,1,2,3]
list_2 = list_1
list_2[0] = 1000
print(list_1)
print(list_2)
production
[1000, 1, 2, 3]
[1000, 1, 2, 3]
L'histoire de la création d'une copie non-pass-by-reference d'une liste Python dit qu'il est facile de copier en tranches, mais c'est ** liste Seulement dans une dimension ** Fonctionne très bien.
Lorsque la liste comporte plus de deux dimensions, elle ressemble à ceci: Cela ne semble pas fonctionner car le passage par référence se produit en cours de route.
anti_pattern_2
#Copiez la liste d'origine en tranches(2D)
list_3 = [[0,1,2], [3,4,5]]
list_4 = list_3[:]
list_4[0][0] = 1000
print(list_3)
print(list_4)
production
[[1000, 1, 2], [3, 4, 5]]
[[1000, 1, 2], [3, 4, 5]]
Vous pouvez également obtenir le même résultat en utilisant la méthode list ()
au lieu de trancher.
Lorsque vous dupliquez une liste normalement, la référence elle-même est copiée, pas la valeur. C'est ce qu'on appelle une ** copie superficielle **. Inversement, copier uniquement la valeur est appelé ** copie profonde **. En Python, une copie superficielle est appliquée aux objets complexes tels que les listes et les dictionnaires, sauf indication contraire. La raison pour laquelle la liste multidimensionnelle a été passée par référence lors de la copie en tranches est probablement parce que la deuxième copie de dimension à l'intérieur de la tranche était une copie superficielle.
Et la méthode copy.deepcopy ()
est une instruction pour "faire une copie complète". Avec lui, même une copie d'une liste multidimensionnelle fera une copie complète de chaque élément.
Voir les opérations officielles de copie --- copie superficielle et copie profonde pour plus d'informations.
Tranche pour la liste 1D, list ()
, copy.deepcopy ()
Copy.deepcopy ()
pour les listes multidimensionnelles
Recommended Posts