"Les boucles for et les list comprehensions fonctionnent de la même manière et font la même chose."
C'est une affirmation qu'on retrouve dans quasi tous les cours, vidéos et blogs d'introduction à Python (ou une variante de cette affirmation… tu vois l'idée).
Mais ce n'est pas tout à fait vrai.
Bien sûr, en termes d'objectif, elles font exactement la même chose, et je ne dis pas le contraire.
Mais ce que la plupart des développeurs Python ignorent, c'est qu'il existe une différence assez subtile dans la façon dont une list comprehension et une boucle for fonctionnent en interne au niveau du scope. Et c'est quelque chose que tout développeur Python devrait connaître.
Aujourd'hui, je veux partager ça avec toi.
C'est parti !
Prenons ce simple code avec une boucle for :

Après l'exécution de cette boucle for, si on essaie d'accéder à la variable de boucle (loop_var), on constate que la variable est toujours accessible, comme illustré ci-dessous :

Jusque-là, tout va bien.
Maintenant, faisons la même chose avec une list comprehension. Le code suivant est l'équivalent en list comprehension de la boucle for ci-dessus :

Après l'exécution de cette list comprehension, si on essaie d'accéder à la variable de boucle (loop_var), on constate que la variable n'est PAS accessible :

Étrange, non ?
Pourquoi la variable de boucle est-elle accessible avec une boucle for, mais pas avec une list comprehension ?
Cela nous amène à une différence essentielle dans le fonctionnement fondamental de la boucle for et de la list comprehension. Et c'est un point que la plupart des tutoriels Python n'abordent pas.
Quand on utilise une boucle for, Python laisse "fuiter" la variable de boucle dans le scope englobant. Autrement dit, on peut toujours accéder à la variable de boucle une fois la boucle terminée.
Mais une list comprehension ne fonctionne pas de cette manière. La variable de boucle reste toujours locale à la list comprehension et ne fuite jamais à l'extérieur.
De plus, si on utilise une variable préexistante comme variable de boucle, la boucle for mettra à jour sa valeur, tandis que la list comprehension la laissera inchangée.
On peut le vérifier sur l'image ci-dessous :

La valeur de la variable existante (loop_var) :
est mise à jour quand elle est utilisée dans une boucle for.
reste inchangée quand elle est utilisée dans une list comprehension.
La list comprehension ne met pas à jour la valeur parce que, comme on l'a vu plus haut, elle crée une copie locale de la variable de boucle.
Cette discussion est étroitement liée au concept de "scope" en Python, qui peut être de quatre types et constitue un sujet fondamental en Python.
Envie d'aller plus loin ? DataXp t'attend : formations et parcours pour progresser en data science, machine learning et IA.
👉 À toi de jouer : quels sont les autres concepts techniques de Python que la plupart des développeurs interprètent mal ?

