Maison >développement back-end >Tutoriel Python >Pourquoi la compréhension de ma liste Python modifie-t-elle la valeur de ma variable ?

Pourquoi la compréhension de ma liste Python modifie-t-elle la valeur de ma variable ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-29 12:08:11955parcourir

Why Does My Python List Comprehension Change My Variable's Value?

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!

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