Maison > développement back-end > Tutoriel Python > Copie superficielle ou profonde dans les dictionnaires Python : quand `copy()` échoue-t-il ?

Copie superficielle ou profonde dans les dictionnaires Python : quand `copy()` échoue-t-il ?

Mary-Kate Olsen
Libérer: 2024-11-22 20:20:13
original
254 Les gens l'ont consulté

Shallow vs. Deep Copy in Python Dictionaries: When Does `copy()` Fail?

Copie superficielle vs copie profonde en Python : comprendre les effets sur les dictionnaires

La copie superficielle d'un dictionnaire en Python, créée à l'aide de dict .copy() peut ne pas mettre à jour le dictionnaire d'origine comme prévu. Ce comportement découle du concept de copie superficielle ou profonde.

Qu'est-ce que la copie superficielle ?

Dans une copie superficielle, le contenu du dictionnaire est plutôt référencé. que copié par valeur. Cela signifie que les dictionnaires original et copié pointent vers les mêmes structures de données sous-jacentes.

Démonstration :

>> original = dict(a=1, b=2)
>> new = original.copy()
>> new.update({'c': 3})
>> original
{'a': 1, 'b': 2}
Copier après la connexion

Contrairement aux attentes, le dictionnaire original reste inchangé après la mise à jour de la copie superficielle. En effet, les références aux données sont partagées et non copiées.

Comment les listes diffèrent :

Contrairement aux dictionnaires, la copie superficielle des listes entraîne une référence partagée aux données. données. En effet, les listes contiennent des valeurs par référence.

>> original = [1, 2, 3]
>> new = original
>> new.append(4)
>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])
Copier après la connexion

Dans ce cas, la liste originale et la nouvelle liste font référence aux mêmes données, donc les modifications apportées à l'une affectent l'autre.

Copie approfondie avec copy.deepcopy()

Pour créer une copie vraiment distincte d'un dictionnaire, y compris son contenu, copy.deepcopy() doit être utilisée. Cette fonction copie la structure et les valeurs par valeur, assurant un isolement complet.

import copy
>> original = dict(a=1, b=2)
>> new = copy.deepcopy(original)
>> new.update({'c': 3})
>> original
{'a': 1, 'b': 2}
>> new
{'a': 1, 'c': 3, 'b': 2}
Copier après la connexion

Types d'opérations de copie :

  1. Affectation de référence (un = b): Les deux variables pointent vers le même objet.
  2. Copie superficielle (b = a.copy()) : Objets séparés, mais les données sous-jacentes sont partagées.
  3. Deep Copy (b = copy.deepcopy(a)) : Complètement isolé, avec des structures distinctes et des valeurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal