La question a déjà été répondu par aaronasterling
Cependant, quelqu'un pourrait être intéressé par la façon dont les variables sont stockées sous le capot.
Avant de venir à l'extrait de code:
Les fermetures sont des fonctions qui héritent des variables à partir de leur joignant l'environnement. Lorsque vous passez un rappel de fonction comme argument d'une autre fonction qui va faire des I/O, cette fonction de callback sera appelé plus tard, et cette fonction sera - presque comme par magie - vous rappeler le contexte dans lequel il a été déclaré, avec toutes les variables disponibles dans ce contexte.
Si une fonction n'utilise pas de variables libres, il ne se forme pas une fermeture.
Si il y a un autre niveau interne qui utilise des variables libres -- tous les niveaux précédents sauver l'environnement lexical ( par exemple à la fin )
fonction des attributs func_closure
en python < 3.X ou __closure__
en python > 3.X enregistrer les variables libres.
Chaque fonction en python a cette fermeture attributs, mais il n'a pas d'enregistrer tout contenu si il n'y a pas de variables libres.
exemple: de la fermeture des attributs, mais pas de contenu à l'intérieur comme il n'y a pas de variable libre.
>>> def foo():
... def fii():
... pass
... return fii
...
>>> f = foo()
>>> f.func_closure
>>> 'func_closure' in dir(f)
True
>>>
NB: GRATUIT VARIABLE EST DE CRÉER UN SYSTÈME DE FERMETURE.
Je vais expliquer à l'aide du même extrait que ci-dessus:
>>> def make_printer(msg):
... def printer():
... print msg
... return printer
...
>>> printer = make_printer('Foo!')
>>> printer() #Output: Foo!
Et toutes les fonctions Python ont une fermeture attribut donc, nous allons examiner les enfermant des variables associées à une fonction de clôture.
Ici est l'attribut func_closure
pour la fonction printer
>>> 'func_closure' in dir(printer)
True
>>> printer.func_closure
(<cell at 0x108154c90: str object at 0x108151de0>,)
>>>
L' closure
attribut renvoie un tuple de la cellule des objets qui contiennent des détails sur les variables définies dans le cadre englobant.
Le premier élément dans la func_closure qui pourrait être rien ou un n-uplet de cellules qui contiennent des liaisons pour la fonction de variables libres et il est en lecture seule.
>>> dir(printer.func_closure[0])
['__class__', '__cmp__', '__delattr__', '__doc__', '__format__', '__getattribute__',
'__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'cell_contents']
>>>
Ici, au-dessus de la sortie, vous pouvez voir l' cell_contents
, voyons ce que les magasins de:
>>> printer.func_closure[0].cell_contents
'Foo!'
>>> type(printer.func_closure[0].cell_contents)
<type 'str'>
>>>
Donc, quand nous avons appelé la fonction printer()
, il accède à la valeur stockée à l'intérieur de l' cell_contents
. C'est ainsi que nous avons eu la sortie 'Foo!'
De nouveau, je vais vous expliquer à l'aide de l'extrait ci-dessus, avec quelques modifications:
>>> def make_printer(msg):
... def printer():
... pass
... return printer
...
>>> printer = make_printer('Foo!')
>>> printer.func_closure
>>>
Dans l'extrait ci-dessus, j'din pas imprimer msg à l'intérieur de l'imprimante de la fonction, de sorte qu'il ne crée pas de variable libre. Comme il n'existe pas de variable, il n'y aura pas de contenu à l'intérieur de la clôture. C'est exactement ce que nous voyons ci-dessus.
Maintenant je vais vous expliquer un autre extrait pour effacer tout Free Variable
avec Closure
:
>>> def outer(x):
... def intermediate(y):
... free = 'free'
... def inner(z):
... return '%s %s %s %s' % (x, y, free, z)
... return inner
... return intermediate
...
>>> outer('I')('am')('variable')
'I am free variable'
>>>
>>> inter = outer('I')
>>> inter.func_closure
(<cell at 0x10c989130: str object at 0x10c831b98>,)
>>> inter.func_closure[0].cell_contents
'I'
>>> inn = inter('am')
Nous voyons donc qu'un func_closure
de la propriété est un tuple de la fermeture des cellules, nous pouvons nous référer à eux et leur contenu de façon explicite-une cellule a des biens "cell_contents"
>>> inn.func_closure
(<cell at 0x10c9807c0: str object at 0x10c9b0990>,
<cell at 0x10c980f68: str object at 0x10c9eaf30>,
<cell at 0x10c989130: str object at 0x10c831b98>)
>>> for i in inn.func_closure:
... print i.cell_contents
...
free
am
I
>>>
Ici, lorsque nous les avons appelés inn
, il sera de renvoyer tous les gagner gratuitement des variables ainsi nous obtenons I am free variable
>>> inn('variable')
'I am free variable'
>>>