Comment copier un dictionnaire en Python

Rayven Esplanada 30 janvier 2023
  1. Copier un dictionnaire en Python : Passage par référence
  2. Copier un dictionnaire en Python : Passage par valeur
  3. Copie peu profonde du dictionnaire Python
Comment copier un dictionnaire en Python

Ce tutoriel explique comment copier un dictionnaire en Python.

Nous allons démontrer comment copier un dictionnaire de deux manières : en passant par la valeur et en passant par la référence.

Copier un dictionnaire en Python : Passage par référence

En Python, les objets ne sont pas implicitement copiés. Si nous essayons de copier food vers une nouvelle variable meal, les valeurs de food seront copiées dans meal, mais la référence de food le sera aussi.

meal = food

Si l’on met directement un objet en équation avec un autre, le nouvel objet pointera vers le précédent ; cela signifie que les deux variables feront référence au même objet unique.

Si nous mettons à jour la valeur Fruit dans meal en Banana, la valeur de Fruit dans food sera également remplacée.

meal["Fruit"] = "Banana"
print(food)
print(meal)

Production :

{'Fruit': 'Banana', 'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod'}
{'Fruit': 'Banana', 'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod'}

Il en va de même si nous essayons de mettre à jour une clé dans le bloc meal. Nous remplacerons la clé Fruit par Circle Fruit et copierons sa valeur avant de la sortir du dictionnaire.

meal["Circle Fruit"] = meal.pop("Fruit")
print(food)
print(meal)

Production :

{'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod', 'Circle Fruit': 'Orange'}
{'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod', 'Circle Fruit': 'Orange'}

La valeur de food sera toujours remplacée même si nous ne l’avons pas directement modifiée ; c’est parce que la méthode que nous avons utilisée pour copier food vers meal est de passer par référence.

Dictionnaire de copie Python - Passage par référence

Copier un dictionnaire en Python : Passage par valeur

Le passage en valeur signifie qu’une copie réelle de l’objet sera créée en mémoire, au lieu de pointer la copie vers l’objet original lors de la copie d’un objet.

Si nous voulons copier un dictionnaire et éviter de référencer les valeurs originales, nous devons trouver un moyen d’instancier un nouvel objet dans la mémoire. En Python, il existe quelques fonctions qui supportent cette approche : dict(), copy(), et deepcopy().

La fonction dict() instancie un nouvel objet du dictionnaire. Si vous enroulez un dictionnaire existant autour de cette fonction, une nouvelle instance de l’objet sera créée.

Pour cette méthode, nous allons utiliser le même exemple du dictionnaire food.

meal = dict(food)

Une autre façon de passer par valeur est d’utiliser la commande copy(), qui fait la même chose que dict() : instancier un nouvel objet dans la mémoire. La différence est que copy() est une fonction intégrée des objets de collection, y compris les dictionnaires.

meal = food.copy()

Pour les deux scénarios, modifions la valeur de Fruit et remplaçons la clé Vegetable :

meal["Fruit"] = "Apple"
meal["Greens"] = meal.pop("Vegetable")
print(food)
print(meal)

Production:

{'Fruit': 'Orange', 'Vegetable': 'Lettuce', 'Poultry': 'Chicken', 'Fish': 'Cod'} # food (original)
{'Fruit': 'Apple', 'Poultry': 'Chicken', 'Fish': 'Cod', 'Greens': 'Lettuce'} # meal (copy)

En instanciant un nouvel objet meal en utilisant dict() ou copy(), nous évitons de référencer l’objet original et de mettre à jour ses valeurs si meal est mis à jour.

Copie peu profonde du dictionnaire Python

Le problème avec dict() et copy() est qu’ils n’appliquent qu’une copie peu profonde à l’objet utilisé ; ce sera un problème si votre dictionnaire a une structure imbriquée complexe.

La copie superficielle ne copiera que la première couche de la mémoire qu’elle voit car les objets imbriqués occupent de nouveaux espaces.

Dictionnaire de copie Python - Copie peu profonde

Changeons l’objet original en un dictionnaire imbriqué.

info = {
    "Numbers": [1, 2, 3],
    "Resident Name": "Sherlock",
    "Address": {"Street": "Baker", "Number": "221B", "City": "Miami"},
}

Déclarons un nouvel objet info2 en utilisant copy() et dict() pour copier à partir de info et changer certaines valeurs dans le dictionnaire imbriqué.

info2 = info.copy()  # or dict(info)
info2["Numbers"][1] = 4
info2["Resident Name"] = "Holmes"
info2["Address"]["City"] = "Lexington"
print(info)
print(info2)

Production :

{'Numbers': [1, 4, 3], 'Resident Name': 'Sherlock', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Lexington'}}
{'Numbers': [1, 4, 3], 'Resident Name': 'Holmes', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Lexington'}}

Les nouvelles valeurs de Numbers et Address.City sont mises à jour dans la version originale et dans la version copiée. La valeur Resident Name n’a mis à jour que le bloc info2 car nous n’avons effectué qu’une copie superficielle de l’objet.

Copie profonde avec le module copy en Python

La copie profonde résout essentiellement le problème de la copie superficielle. Lors de la copie d’un objet, elle vérifie les objets imbriqués et crée récursivement de nouveaux objets dans la mémoire.

En Python, nous pouvons réaliser une copie profonde avec le module copy, qui contient des opérations de copie peu profonde et profonde et des utilitaires.

import copy

Nous utiliserons la fonction deepcopy() du module pour copier en profondeur les objets imbriqués dans notre dictionnaire. Nous utiliserons le même exemple que le bloc info ci-dessus.

info2 = copy.deepcopy(info)
info2["Numbers"][1] = 4
info2["Resident Name"] = "Holmes"
info2["Address"]["City"] = "Lexington"
print(info)
print(info2)

Production :

{'Numbers': [1, 2, 3], 'Resident Name': 'Sherlock', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Miami'}}
{'Numbers': [1, 4, 3], 'Resident Name': 'Holmes', 'Address': {'Street': 'Baker', 'Number': '221B', 'City': 'Lexington'}}

Maintenant, le dictionnaire original info reste inchangé, même avec les multiples changements dans info2, y compris les objets imbriqués.

En résumé, il existe de nombreuses façons de copier un dictionnaire en Python, mais la sortie ne sera pas la même pour tous. En assignant directement un dictionnaire avec =, vous le passerez par référence, en pointant vers l’objet original.

Des fonctions de copie peu profondes comme dict() et copy() ne résoudront ce problème que pour les dictionnaires non imbriqués.
La meilleure façon de copier un dictionnaire, en considérant les dictionnaires imbriqués, est d’utiliser la fonction deepcopy() fournie par le module copy().

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

Article connexe - Python Dictionary