En plongeant dans les subtilités des fermetures lexicales, un comportement particulier dans le code Python devient évident. Prenons l'exemple suivant :
flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2)
À notre grande surprise, ce code affiche "4 4 4" au lieu du "0 2 4" attendu. Ce comportement inattendu provient de la façon dont Python gère les fermetures lexicales.
Contrairement à Perl, qui crée une nouvelle fermeture pour chaque itération, Python crée trois fonctions distinctes. Cependant, chaque fonction conserve la fermeture de l'environnement dans lequel elle a été définie, à savoir l'environnement global. Cette fermeture partagée fait que chaque fonction fait référence à la même variable mutable i, conduisant à un résultat inattendu.
Pour résoudre ce problème, une solution modifiée doit être utilisée. En introduisant un créateur de fonction et en l'invoquant dans la boucle, nous créons des environnements distincts pour chaque fonction avec une valeur i unique :
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)
Ce code révisé corrige le problème, démontrant les différences subtiles mais significatives dans la façon dont Python et Perl gèrent les fermetures lexicales. En comprenant le comportement de fermeture du langage de programmation spécifique utilisé, les développeurs peuvent éviter de tels résultats inattendus et écrire un code plus robuste et plus prévisible.
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!