Le GIST à prendre est le suivant: Traiter des listes superficielles (pas de sous-listes, juste des éléments simples) en utilisant une «affectation normale» augmente un «effet secondaire» lorsque vous créez une liste peu profonde, puis vous créez une copie de cette liste en utilisant une «affectation normale» . Cet "effet secondaire" survient lorsque vous modifiez un élément de la liste de copie créée, car il modifie automatiquement les mêmes éléments de la liste d'origine. C'est quand cela copy
est pratique, car cela ne changera pas les éléments de la liste d'origine lors du changement des éléments de copie.
D'un autre côté, copy
cela a également un "effet secondaire" lorsque vous avez une liste qui contient des listes (sub_lists) et la deepcopy
résout. Par exemple, si vous créez une grande liste contenant des listes imbriquées (sub_lists) et que vous créez une copie de cette grande liste (la liste d'origine). L '«effet secondaire» se produirait lorsque vous modifiez les sous-listes de la liste de copie, ce qui modifierait automatiquement les sous-listes de la grande liste. Parfois (dans certains projets), vous souhaitez conserver la grande liste (votre liste d'origine) telle qu'elle est sans modification, et tout ce que vous voulez, c'est faire une copie de ses éléments (sub_lists). Pour cela, votre solution est d'utiliser deepcopy
ce qui va prendre en charge cet "effet secondaire" et en faire une copie sans modifier le contenu d'origine.
Les différents comportements copy
et deep copy
opérations ne concernent que les objets composés (c'est-à-dire les objets qui contiennent d'autres objets tels que des listes).
Voici les différences illustrées dans cet exemple de code simple:
Première
vérifions le copy
comportement (superficiel), en créant une liste originale et une copie de cette liste:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Maintenant, exécutons quelques print
tests et voyons comment la liste d'origine se comporte par rapport à sa liste de copie:
original_list et copy_list ont des adresses différentes
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
les éléments de original_list et copy_list ont les mêmes adresses
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
les sous-éléments de original_list et copy_list ont les mêmes adresses
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x1faef08 0x1faef08
la modification des éléments original_list ne modifie PAS les éléments copy_list
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
la modification des éléments copy_list ne modifie PAS les éléments original_list
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
la modification des sous-éléments de la liste d'origine modifie automatiquement les sous-éléments de la liste de copie
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 7]
la modification des sous-éléments copy_list modifie automatiquement les sous-éléments original_list
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 7]
Seconde
vérifions comment deepcopy
se comporte, en faisant la même chose que nous avons fait avec copy
(création d'une liste originale et d'une copie de cette liste):
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
Maintenant, exécutons quelques print
tests et voyons comment la liste d'origine se comporte par rapport à sa liste de copie:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.deepcopy(original_list)
original_list et copy_list ont des adresses différentes
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
les éléments de original_list et copy_list ont les mêmes adresses
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
les sous-éléments de original_list et copy_list ont des adresses différentes
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x24eef08 0x24f3300
la modification des éléments original_list ne modifie PAS les éléments copy_list
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
la modification des éléments copy_list ne modifie PAS les éléments original_list
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
la modification des sous-éléments de la liste d'origine ne modifie PAS les sous-éléments de la copie_liste
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
la modification des sous-éléments copy_list ne modifie PAS les sous-éléments original_list
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'd'], 7]