[PYTHON] Bild der Schließung

Einführung

Diese Frage (keine Frage zu Qiita)

Ich verstehe, dass die äußeren Variablen im Abschluss referenziert werden können, bin aber nicht überzeugt. Verschwindet die Variable [^ 1](einschließlich Argumente) in der Funktion nicht, wenn die Funktion endet? Die Variable kann irgendwo gespeichert werden, aber wo ist sie konkret?

[^ 1]: Um genau zu sein, das Objekt, auf das die Variable verweist

Andererseits

"Zuerst muss man denken, dass es so ist. Wenn man mehr wissen will, muss man die Python-Quelle lesen. Übrigens ist es an eine Funktion gebunden (näher)."

Ich antwortete, aber als ich etwas mehr darüber nachdachte,

"Wo haben Sie aus dem Konzept gelernt, dass Variablen verschwinden, wenn die Funktion endet (obwohl sie verschwindet)? Es wird davon ausgegangen, dass keine Kenntnisse über die Sprachimplementierung vorhanden sind (dh Kenntnisse darüber, dass Variablen auf dem Stapel gesichert sind [^ 2])."

[^ 2]: Weitere Informationen zu diesem Bereich finden Sie hier](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% Siehe auch 89% E6% 95% B0)

Ich machte mir darüber Sorgen. Deshalb werde ich dieses Mal das Konzept hier mit Bildern erklären.

Funktionen, Variablen und Funktionsende

Vor dem Schließen ist eine normale Funktion.

Gewöhnliche Funktion


def add(a, b):
    return a + b

add(2, 3)

In der letzten Zeile wird "add" mit "a" als 2 und "b" als 3 aufgerufen. Wenn Sie dies in der Abbildung zeichnen, sieht es wie folgt aus.

func_exec_state1.png

Der "Ausführungsstatus von add" ist auf das "Verhalten beim Beenden der Funktion" zurückzuführen, das später erläutert wird (die Geschichte wird ungenau, wenn "add" verwendet wird), aber trotzdem für das Objekt "2". Ab dem Ausführungsstatus erscheinen für das Objekt "3" der Pfeil "a" und der Pfeil "b". Machen Sie sich nicht zu viele Sorgen, da a und b auf dem Kopf stehen und der Zahl entsprechen, die Sie später zeichnen werden.

Wenn "add" endet, verschwindet der "Ausführungsstatus von add". Dann verschwinden natürlich auch die Pfeile "a" und "b" aus dem laufenden Zustand. Dies ist die Situation, in der die Variable verschwindet, wenn die Funktion endet.

func_exec_state2.png

Verschlüsse und Variablen

Bisher haben wir "Bild von Variablen, wenn eine Funktion ausgeführt wird" und "Bild von Variablen, wenn eine Funktion endet" erklärt. Lassen Sie uns in diesem Sinne mit Closure fortfahren. Es gibt eine nutzlose "b" -Variable, aber sie ist praktisch für die Geschichte.

Schließung


def make_adder(a, b):
    def adder(x):
        return x + a
    return adder

adder3 = make_adder(2, 3)
adder3(4)

Wenn der Aufruf "make_adder (2, 3)" erfolgt und die Zeit vor der "Rückkehr" des "make_adder" (dh nachdem der "Addierer" definiert wurde) in der Abbildung wie folgt gezeichnet ist. Mit anderen Worten, die "2", auf die "a" zeigt, wird sowohl von "make_adder" (Ausführungsstatus) als auch von "adder" referenziert. [^ 3]

func_exec_state3.png

[^ 3]: Der Pfeil aus "make_adder Ausführungsstatus" und der Pfeil, auf den verwiesen wird, sind "Addierer", aber dies ist kein Fehler, da "die Funktion selbst den Namen Addierer hat".

Wenn make_adder beendet ist, verschwindet der Ausführungsstatus wie eine normale Variable. Der blau geschriebene "Addierer" -Körper wurde jedoch zurückgegeben, sodass er nicht verschwindet. Und das "a" (auf "2" gezeigt), auf das der "Addierer" verweist, verschwindet auch nicht.

func_exec_state4.png

Auf diese Weise bleibt "a" (worauf verwiesen wird) erhalten. Wenn danach "adder3 (4)" aufgerufen wird, kann die gespeicherte "2" abgerufen und verwendet werden.

closure_exec_state.png

Das ist es. Oh, ich denke, nicht lokal ist etwas nerviger, aber ich habe es nicht überprüft, also werde ich es weglassen.

Referenz

[Python] Was ist ein Abschluss (Funktionsabschluss) Es wird detailliert beschrieben, wie Variablen gespeichert werden.

[Python / Closure lesen](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) Dies ist ein Memo, als ich vor ungefähr zweieinhalb Jahren "Details der Cloger-Implementierung" las.

Recommended Posts

Bild der Schließung
[PyTorch] Bildklassifizierung von CIFAR-10
Anwendung der CNN2-Bilderkennung
Schließung
Bilderfassung von Firefox mit Python
Extrahieren Sie Feature-Punkte eines Bildes
Bilderkennung von Früchten mit VGG16
Ein Memorandum über den Inhalt der Abschlussumfrage
Grundlagen der binärisierten Bildverarbeitung durch Python
Abschlussimplementierung
Python: Anwendung der Bilderkennung mit CNN
[Python] Berechnung der Bildähnlichkeit (Würfelkoeffizient)
Graustufen durch Matrix-Reinventor der Python-Bildverarbeitung-
Entfernung von Bildrauschen
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Analyse des Röntgenmikrotomographiebildes durch Python
Bilderkennung
Bildcrawler
[Bildklassifizierung] Hundegesichtsanalyse
Faltungsfilterung durch Matrix-Reinventor der Python-Bildverarbeitung-
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Extrahieren Sie die dominante Bildfarbe durch k-Mittel-Clustering
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Bildverarbeitung? Die Geschichte, Python für zu starten
Richter Yosakoi Naruko nach Bildklassifikation von Tensorflow.
Super (kurze) Zusammenfassung der Bildklassifizierung durch ArcFace
Grundprinzipien der Bilderkennungstechnologie (für Anfänger)
Implementierung eines Deep Learning-Modells zur Bilderkennung
ROS-Kurs 119 Korrigieren Sie die Farbe des Kamerabildes
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
[Kleine Geschichte] Laden Sie das Bild von Ghibli sofort herunter
[Python + OpenCV] Malen Sie den transparenten Teil des Bildes weiß