Comprendre les fermetures lexicales : une énigme Python
Dans le domaine de la programmation fonctionnelle, les fermetures lexicales jouent un rôle crucial. Cependant, certains langages de programmation peuvent introduire des complexités dans la compréhension de leur comportement. Python, par exemple, propose un puzzle intrigant qui illustre l'interaction des fermetures et des environnements.
L'extrait de code Python suivant sert d'exemple :
flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2)
Ce code affiche étonnamment "4 4 4" au lieu du "0 2 4" attendu. Même si l'on pourrait initialement soupçonner que la variable globale i est partagée entre les fonctions, le problème persiste même lorsque i est déclaré localement au sein d'une fonction imbriquée.
La clé pour comprendre ce comportement réside dans le concept de fermetures. En Python, chaque fonction imbriquée conserve la fermeture de sa portée conteneur. Dans ce cas, les fonctions imbriquées partagent la fermeture de l'environnement global, y compris la variable mutable i. Comme i est modifié au cours de la boucle, toutes les fonctions font référence à la valeur modifiée.
Pour contourner ce problème et garantir le comportement souhaité, on peut recourir à une approche de créateur de fonction. En appelant une fonction de créateur au lieu de créer des fonctions en ligne, des environnements distincts sont établis pour chaque fonction créée.
Voici un exemple du code révisé :
flist = [] for i in xrange(3): def funcC(j): def func(x): return x * j return func flist.append(funcC(i)) for f in flist: print f(2)
Cette approche génère efficacement des fonctions distinctes avec fermetures uniques, conduisant au résultat attendu de "0 2 4".
Ainsi, bien que les fermetures offrent des capacités puissantes, leur interaction avec les environnements peut introduire de subtiles complexités. Un examen attentif de la portée et des nuances des fermetures est essentiel pour exploiter leur plein potentiel.
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!