Maison >développement back-end >Tutoriel Python >Pourquoi l'affectation Python affiche-t-elle un comportement inattendu avec les objets mutables ?
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 :
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!