[PYTHON] Image de fermeture

introduction

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.

Fonctions, variables et fin de fonctions

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.

func_exec_state1.png

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.

func_exec_state2.png

Fermetures et variables

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]

func_exec_state3.png

[^ 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.

func_exec_state4.png

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é.

closure_exec_state.png

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.

référence

[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

Image de fermeture
[PyTorch] Classification des images du CIFAR-10
Application de la reconnaissance d'image CNN2
fermeture
Capture d'image de Firefox en utilisant Python
Extraire les points caractéristiques d'une image
Reconnaissance d'image des fruits avec VGG16
Un mémorandum du contenu de l'enquête de clôture
Bases du traitement d'images binarisées par Python
Mise en œuvre de la fermeture
Python: Application de la reconnaissance d'image à l'aide de CNN
[Python] Calcul de la similarité d'image (coefficient de dés)
Échelle de gris par matrice-Reinventor of Python image processing-
Suppression du bruit de l'image
Dessin avec Matrix-Reinventor of Python Image Processing-
Analyse d'image de microtomographie à rayons X par Python
Reconnaissance d'image
Explorateur d'images
[Classification des images] Analyse faciale du chien
Filtrage par convolution par matrice-Reinventor of Python image processing-
J'ai essayé la reconnaissance d'image de CIFAR-10 avec Keras-Learning-
Extraire la couleur dominante de l'image par clustering k-means
J'ai essayé de corriger la forme trapézoïdale de l'image
Traitement d'image? L'histoire du démarrage de Python pour
Juge Yosakoi Naruko par classification d'image de Tensorflow.
Résumé super (concis) de la classification des images par ArcFace
Principes de base de la technologie de reconnaissance d'image (pour les débutants)
Implémentation du modèle Deep Learning pour la reconnaissance d'images
Cours ROS 119 Corriger la couleur de l'image de la caméra
J'ai essayé d'utiliser le filtre d'image d'OpenCV
[Petite histoire] Téléchargez l'image de Ghibli immédiatement
[Python + OpenCV] Peignez la partie transparente de l'image en blanc