Fonctions imbriquées et accès aux variables locales
En Python, les fonctions imbriquées peuvent accéder aux variables locales à partir de leur portée englobante. Cependant, le timing de cet accès peut être contre-intuitif.
Considérez l'extrait de code suivant :
class Cage(object): def __init__(self, animal): self.animal = animal def gotimes(do_the_petting): do_the_petting() def get_petters(): for animal in ['cow', 'dog', 'cat']: cage = Cage(animal) def pet_function(): print "Mary pets the " + cage.animal + "." yield (animal, partial(gotimes, pet_function)) funs = list(get_petters()) for name, f in funs: print name + ":", f()
Au lieu d'obtenir le résultat attendu où Mary caresse chaque animal, la sortie affiche "Mary caresse le chat" pour les trois animaux. Ce comportement se produit parce que la fonction imbriquée pet_function recherche la variable locale cage au moment de l'exécution, pas au moment de la définition.
Lorsque la fonction get_petters est appelée, la variable locale cage est attribuée successivement à chaque animal. dans la boucle. Cependant, à la fin de la fonction, cage contient la dernière valeur (« cat »). Lorsque les fonctions renvoyées par get_petters sont appelées, elles accèdent toutes à la même variable cage avec la valeur 'cat'.
Pour résoudre ce problème, on peut utiliser différentes techniques, telles que :
Utilisation d'une fonction partielle avec une variable de cage liée :
from functools import partial def pet_function(cage): print "Mary pets the " + cage.animal + "." yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
Création d'une nouvelle portée pour la fonction imbriquée :
def scoped_cage(cage): def pet_function(): print "Mary pets the " + cage.animal + "." return pet_function yield (animal, partial(gotimes, scoped_cage(cage)))
Liaison de la variable comme valeur par défaut pour un paramètre de mot-clé :
def pet_function(cage=cage): print "Mary pets the " + cage.animal + "." yield (animal, partial(gotimes, pet_function))
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!