Maison >développement back-end >Tutoriel Python >Pourquoi l'affectation Python affiche-t-elle un comportement inattendu avec les objets mutables ?

Pourquoi l'affectation Python affiche-t-elle un comportement inattendu avec les objets mutables ?

DDD
DDDoriginal
2024-12-07 20:25:16482parcourir

Why Does Python Assignment Show Unexpected Behavior with Mutable Objects?

Comportement de copie dans l'affectation Python

Introduction

Python, un langage de programmation populaire, présente un comportement particulier lorsque attribuer des objets à des variables via l'opérateur d'affectation (=). Ce comportement, communément appelé copie directe, conduit souvent à des résultats inattendus. Pour démêler ce concept, examinons un exemple courant.

Le problème : copie directe ou copie

Considérez le code suivant :

dict_a = dict_b = dict_c = {}
dict_c['hello'] = 'goodbye'

print(dict_a)
print(dict_b)
print(dict_c)

On pourrait s'attendre à ce que ce code crée trois dictionnaires distincts, les initialise à vides, puis modifie uniquement dict_c. Le résultat attendu devrait être :

{}
{}
{'hello': 'goodbye'}

Cependant, le comportement de copie de Python donne un résultat différent :

{'hello': 'goodbye'}
{'hello': 'goodbye'}
{'hello': 'goodbye'}

Explication : affectation de référence

La clé pour comprendre ce comportement réside dans la nature des variables en Python. En Python, les variables (ou noms) sont simplement des pointeurs vers les objets réels stockés en mémoire. Lorsque vous affectez une variable à une autre, l'opérateur d'affectation (=) copie l'adresse mémoire (ou le pointeur) d'une variable à une autre. Dans notre exemple :

dict_a = dict_b = dict_c

Cela signifie que dict_a, dict_b et dict_c pointent tous vers le même objet dictionnaire en mémoire. Par conséquent, lorsque dict_c est modifié, les trois variables voient la même modification, ce qui entraîne un effet de copie.

Résoudre le problème : utiliser des méthodes de copie

Pour éviter le comportement de copie, il faut explicitement créer une copie de l'objet sous-jacent. Python propose deux méthodes à cet effet :

  • dict.copy() : crée une copie superficielle qui copie les éléments de niveau supérieur du dictionnaire.
  • copy.deepcopy() : crée une copie complète qui copie de manière récursive tous les objets imbriqués dans le dictionnaire.

Exemple :

dict_a = dict_b.copy()
dict_c = copy.deepcopy(dict_a)

dict_c['hello'] = 'goodbye'

print(dict_a)  # {'hello': 'goodbye'} (shallow copy, affected)
print(dict_b)  # {} (unaffected)
print(dict_c)  # {'hello': 'goodbye'} (deep copy, unaffected)

En utilisant ces méthodes de copie, nous pouvons créer des copies indépendantes d'objets et éviter le comportement de copie.

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!

Déclaration:
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