Déchiffrement des fermetures lexicales en Python vs Perl
Lors de l'exploration des fermetures lexicales en Javascript, la question se pose de leur comportement particulier 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, il génère "4 4 4" au lieu du "0 2 4" attendu.
En revanche, ce code Perl équivalent produit le code souhaité résultat :
my @flist = (); foreach my $i (0 .. 2) { push(@flist, sub {$i * $_[0]}); } foreach my $f (@flist) { print $f->(2), "\n"; }
La différence sous-jacente
La clé la distinction réside dans la façon dont les fermetures capturent leur environnement.
Une solution Python
Pour obtenir le comportement attendu en Python, vous devez forcer environnements distincts pour chaque fonction. Une solution consiste à créer un créateur de fonction qui renvoie une fonction avec une fermeture différente :
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 méthode garantit que chaque fonction a sa propre fermeture distincte, avec sa propre valeur unique de i.
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!