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.
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.
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.
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]
[^ 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.
Auf diese Weise bleibt "a" (worauf verwiesen wird) erhalten. Wenn danach "adder3 (4)" aufgerufen wird, kann die gespeicherte "2" abgerufen und verwendet werden.
Das ist es. Oh, ich denke, nicht lokal ist etwas nerviger, aber ich habe es nicht überprüft, also werde ich es weglassen.
[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