Le comportement inattendu des compréhensions de listes : noms de rebond et portée floue
Les compréhensions de listes de Python offrent un moyen concis et pratique de créer des listes, mais ils comportent un piège caché : relier les noms même au-delà de la portée de la compréhension elle-même. En Python 2, ce comportement particulier a été source de frustration et d'erreurs de programmation.
Considérez le code suivant :
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
En Python 2, l'exécution de ce code imprimera de manière inattendue 4 plutôt que "valeur originale." En effet, la compréhension de liste fait fuir la variable de contrôle de boucle x dans la portée environnante, remplaçant sa valeur d'origine.
Ce comportement découle de la façon dont les compréhensions de liste ont été implémentées dans Python 2 : comme une optimisation pour améliorer leur efficacité. Cependant, cela a constitué un problème important pour les programmeurs Python, entraînant des erreurs et de la confusion.
Heureusement, dans Python 3, ce « sale petit secret » a été éliminé. Les compréhensions de listes adoptent désormais la même stratégie d'implémentation que les expressions génératrices, qui utilisent un cadre d'exécution distinct. Par conséquent, dans Python 3, l'extrait de code ci-dessus imprime correctement la « valeur originale » comme prévu, car le x dans la compréhension n'éclipse pas le x dans la portée environnante.
Guido van Rossum, le créateur de Python, a expliqué le raisonnement derrière ce changement :
"[Nous avons effectué ce changement pour] corriger le 'sale petit secret' de la compréhension des listes en utilisant la même stratégie de mise en œuvre que pour les expressions génératrices.
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!