Maison >développement back-end >Tutoriel Python >En quoi la reliure de noms diffère-t-elle dans les compréhensions de listes Python 2 et 3 ?

En quoi la reliure de noms diffère-t-elle dans les compréhensions de listes Python 2 et 3 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-27 15:07:11381parcourir

How Does Name Rebinding Differ in Python 2 and 3 List Comprehensions?

Reliaison de noms dans les compréhensions de listes Python

Les compréhensions de listes offrent une manière élégante de générer des listes en Python. Cependant, ils présentent une sémantique de portée particulière qui peut conduire à un comportement inattendu.

Considérez l'extrait de code suivant :

x = "original value"
squares = [x**2 for x in range(5)]
print(x)  # Prints 4 in Python 2!

Étonnamment, dans Python 2, ce code affichera "4" au lieu de "valeur originale." Cela se produit parce que les compréhensions de liste « fuient » la variable de contrôle de boucle (ici, « x ») dans la portée environnante. Cela signifie que toute référence ultérieure à "x" fera référence à la valeur attribuée dans la compréhension, même si une variable du même nom existe en dehors de la compréhension.

Ce comportement a été hérité de l'implémentation originale des compréhensions de liste. , qui donnait la priorité aux performances plutôt qu’à l’encapsulation. Dans Python 3, ce « sale petit secret » a été éliminé. Les compréhensions de listes utilisent désormais la même stratégie d'implémentation que les expressions génératrices, qui protègent contre l'observation de noms. En conséquence, dans Python 3, le code ci-dessus affichera la « valeur originale ».

La justification de ce changement a été expliquée par Guido van Rossum, le créateur de Python :

"En Python 2, les compréhensions de liste ont divulgué la variable de contrôle de boucle dans la portée environnante. Cela n'était pas intentionnel et a provoqué de la confusion et des erreurs. Dans Python 3, ce comportement a été modifié pour correspondre aux expressions du générateur, ce qui empêche le nom. shadowing."

Bien que ce changement améliore la robustesse du code Python, il est crucial d'être conscient du comportement différent entre Python 2 et 3. Des techniques d'encapsulation appropriées, telles que le préfixage des variables de contrôle de boucle dans les compréhensions avec des traits de soulignement, peuvent aider à atténuer cet écueil potentiel.

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