Fermetures lexicales en Python : comprendre le comportement inattendu
En Python, les fermetures lexicales permettent aux fonctions internes d'accéder aux variables définies dans la portée englobante. Cependant, un comportement inattendu survient lors de la définition de fonctions dans une boucle modifiant une variable partagée. Pour illustrer cela, considérons le code Python suivant :
flist = [] for i in range(3): def func(x): return x * i flist.append(func) for f in flist: print(f(2))
Ce code affiche "4 4 4", ce qui est surprenant car on pourrait s'attendre à "0 2 4". La raison de ce comportement inattendu réside dans le mécanisme de fermeture. En Python, les fonctions définies dans les boucles créent de nouvelles fonctions mais partagent la portée englobante, qui dans ce cas est la portée globale. Par conséquent, lorsque la valeur de i est modifiée ultérieurement, toutes les fonctions de la liste font référence à la même valeur i modifiée.
Pour résoudre ce problème, il faut créer des environnements uniques pour chaque fonction dans la boucle. . Cela peut être accompli en utilisant un créateur de fonction :
flist = [] for i in range(3): def funcC(j): def func(x): return x * j return func flist.append(funcC(i)) for f in flist: print(f(2))
Dans ce code révisé, chaque appel à funcC génère un nouvel environnement de fermeture avec sa propre valeur de i. En conséquence, chaque fonction de la liste a accès à une valeur i distincte, conduisant au résultat attendu de "0 2 4".
Ce comportement souligne l'importance de comprendre le fonctionnement des fermetures en Python, en particulier lorsque traiter les effets secondaires et la programmation fonctionnelle. Lorsque des fonctions définies dans des boucles partagent une variable modifiée, un comportement inattendu peut survenir. L'utilisation de créateurs de fonctions permet de créer des environnements uniques pour chaque fonction et garantit l'obtention du comportement souhaité.
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!