Comprendre les fermetures lexicales en Python : un examen plus approfondi
Dans le domaine de la programmation, les fermetures lexicales jouent un rôle crucial dans le maintien de l'accès aux variables et les fonctions définies dans les étendues englobantes. Cependant, un phénomène déroutant peut survenir lorsque vous travaillez avec des fermetures en Python.
L'énigme de la fermeture en Python
Considérez le code Python suivant :
flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2)
Étonnamment, ce code affiche « 4 4 4 » au lieu du « 0 2 4 » attendu. Pour comprendre ce comportement, nous devons approfondir la nature des fermetures lexicales en Python.
Comportement de fermeture en Python et Perl
En Python, les fermetures conservent les références aux variables dans le cadre englobant. Cependant, si ces variables sont modifiées dans cette portée, les fermetures captureront les valeurs modifiées, conduisant à des résultats inattendus.
Ce comportement contraste avec Perl, où les fermetures capturent l'environnement au moment de leur création. Dans le code Perl :
my @flist = (); foreach my $i (0 .. 2) { push(@flist, sub {$i * $_[0]}); }
Chaque fermeture capture la valeur de $i au moment de sa création, ce qui donne le résultat attendu : "0 2 4."
Résoudre l'énigme
Pour résoudre le problème en Python, nous pouvons créer des fonctions dans une autre fonction pour isoler les fermetures environnements.
flist = [] def outer(): for i in xrange(3): def inner(x): return x * i flist.append(inner) outer() for f in flist: print f(2)
Ici, chaque itération de la boucle externe crée une nouvelle fonction qui a son propre environnement et une valeur unique de i. En conséquence, nous obtenons le résultat souhaité : "0 2 4."
Conclusion
Les fermetures lexicales fournissent un mécanisme puissant pour accéder aux variables et aux fonctions dans toutes les portées. Cependant, en Python, il est crucial de comprendre les implications de la fermeture sur des variables mutables, car cela peut conduire à un comportement inattendu. En gérant soigneusement les environnements dans lesquels les fermetures sont créées, nous pouvons exploiter tout leur potentiel tout en évitant les pièges.
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!