Comportement inattendu : les compréhensions de listes modifient la portée des variables
Les compréhensions de listes Python sont des outils puissants pour la manipulation des données, mais elles comportent une bizarrerie cachée qui peut conduire à un comportement inattendu.
Le Problème
Dans Python 2 (et versions antérieures), les compréhensions de liste peuvent « relier » la variable de contrôle de boucle à la dernière valeur de la boucle, même après la fin de la portée de la compréhension. Cela peut entraîner un comportement surprenant :
x = "original value" squares = [x**2 for x in range(5)] print(x) # Prints 4 in Python 2!
Dans cet exemple, la variable de contrôle de boucle x est réaffectée à la dernière valeur de la boucle (4) dans la compréhension de la liste. Cela signifie que lorsque print(x) est appelé en dehors de la compréhension, il imprime 4 au lieu de "valeur originale".
Explication
Le comportement décrit ci-dessus est un résultat de la manière dont les compréhensions de listes ont été initialement implémentées dans Python 2. Pour rendre les compréhensions de listes aussi efficaces que possible, la variable de contrôle de boucle a été divulguée dans le système environnant. scope.
Correction Python 3
Dans Python 3, ce comportement a été modifié. Les compréhensions de liste ne relient plus la variable de contrôle de boucle en dehors de la compréhension. Cela a été fait pour améliorer la cohérence entre les compréhensions de liste et les expressions génératrices, qui ne relient jamais la variable de contrôle de boucle.
Explication de Guido van Rossum
Guido van Rossum, le créateur de Python, a expliqué le raisonnement derrière ce changement dans Python 3 :
"Nous avons décidé de corriger le "sale petit secret" de compréhensions de liste en utilisant la même stratégie d'implémentation que pour les expressions génératrices. Ainsi, dans Python 3, l'exemple ci-dessus... affichera « avant », prouvant que le « x » dans la compréhension de liste masque temporairement mais ne remplace pas le « » x' dans le périmètre environnant."
Conclusion
Bien que le comportement des compréhensions de listes puisse sembler contre-intuitif au début, il est important de comprendre comment ils fonctionnent à la fois dans Python 2 et Python 3. Ces connaissances vous aideront à éviter les bugs potentiels et à écrire du code plus robuste.
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!