Cette question (pas une question sur Qiita)
Je comprends que les variables externes peuvent être référencées dans la fermeture, mais je ne suis pas convaincu. La variable [^ 1](y compris les arguments) dans la fonction ne disparaît-elle pas lorsque la fonction se termine? La variable peut être conservée quelque part, mais où est-elle précisément?
[^ 1]: Pour être exact, l'objet référencé par la variable
Au contraire
"Vous devez d'abord penser que c'est ce que c'est. Si vous voulez en savoir plus, vous devez lire le source Python. Au fait, c'est lié à une fonction (plus proche)."
J'ai répondu, mais quand j'y ai réfléchi un peu plus,
"Où avez-vous appris du concept de variables qui disparaissent lorsque la fonction se termine (bien qu'elle disparaisse)? On suppose qu'il n'y a aucune connaissance sur l'implémentation du langage (c'est-à-dire que les variables sont sécurisées sur la pile [^ 2])."
[^ 2]: Pour plus d'informations sur ce domaine, cliquez ici](https://qiita.com/junjis0203/items/7d3e63253a3d291a04c6#%E9%96%A2%E6%95%B0%E3%81%AE%E5% AE% 9F% E8% A1% 8C% E6% 96% B9% E6% B3% 95% E3% 83% AD% E3% 83% BC% E3% 82% AB% E3% 83% AB% E5% A4% Voir aussi 89% E6% 95% B0)
J'étais inquiet à ce sujet. C'est pourquoi cette fois je vais expliquer le concept ici avec des images.
Avant la fermeture est une fonction normale.
Fonction ordinaire
def add(a, b):
return a + b
add(2, 3)
La dernière ligne appelle ʻadd avec ʻa
comme 2 et b
comme 3. Si vous dessinez ceci dans la figure, ce sera comme suit.
L '«état d'exécution d'ajout» est dû au «comportement à la fin de la fonction» expliqué plus tard (l'histoire devient inexacte si «ajouter» est utilisé), mais de toute façon, pour l'objet «2» A partir de l'état d'exécution, la flèche de «a» et la flèche de «b» apparaissent pour l'objet «3». Ne vous inquiétez pas trop car a et b sont à l'envers pour correspondre à la figure que vous dessinerez plus tard.
ʻWhen add` se termine, le "add execution state" disparaît. Ensuite, bien sûr, les flèches «a» et «b» qui sont hors de l'état de fonctionnement disparaissent également. C'est le cas où la variable disparaît lorsque la fonction se termine.
Jusqu'à présent, nous avons expliqué "l'image des variables lorsqu'une fonction est exécutée" et "l'image des variables lorsqu'une fonction se termine". Dans cet esprit, passons à la clôture. Il y a une variable b
inutile, mais c'est pratique pour l'histoire.
fermeture
def make_adder(a, b):
def adder(x):
return x + a
return adder
adder3 = make_adder(2, 3)
adder3(4)
Lorsque l'appel make_adder (2, 3)
est effectué et que le temps avant le retour
de make_adder
(c'est-à-dire après la définition de ʻadder) est dessiné dans la figure comme suit. En d'autres termes, le "2" pointé par ʻa
est référencé à la fois par make_adder
(état d'exécution) et par ʻadder`. [^ 3]
[^ 3]: La flèche de "l'état d'exécution make_adder" et celle pointée sont ʻadder`, mais ce n'est pas une erreur car "la fonction elle-même a le nom additionneur".
Lorsque make_adder
se termine, l'état d'exécution disparaît comme une variable normale. Cependant, le corps «adder» écrit en bleu a été renvoyé, il ne disparaîtra donc pas. Et ʻa (pointé sur "2") référencé par ʻadder
ne disparaît pas non plus.
De cette façon, ʻa(référencé par) reste, donc quand ʻadder3 (4)
est appelé après cela, le" 2 "sauvegardé peut être récupéré et utilisé.
C'est tout. Oh, je pense que non local est un peu plus ennuyeux, mais je ne l'ai pas vérifié, alors je vais l'omettre.
[Python] Qu'est-ce qu'une fermeture (fermeture de fonction) Il décrit en détail comment les variables sont stockées.
[Lire Python / Closure](http://dzeta.jp/~junjis/code_reading/index.php?Python%2F%E3%82%AF%E3%83%AD%E3%83%BC%E3%82 % B8% E3% 83% A3) Ceci est un mémo quand j'ai lu "Détails de l'implémentation de Cloger" il y a environ deux ans et demi.
Recommended Posts