Comment copier un dictionnaire en Python
- Copier un dictionnaire en Python : Passage par référence
- Copier un dictionnaire en Python : Passage par valeur
- Copie peu profonde du dictionnaire 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.
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.
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()
.
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.
LinkedInArticle connexe - Python Dictionary
- Comment vérifier si une clé existe dans un dictionnaire en Python
- Convertir un dictionnaire en liste en Python
- Comment obtenir tous les fichiers d'un répertoire
- Comment trouver la valeur maximale dans le dictionnaire Python
- Comment trier un dictionnaire Python par valeur
- Comment fusionner deux dictionnaires en Python 2 et 3