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 ?
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!