In Python, wenn Sie intern definierte Funktionen in andere Funktionen übergeben, wie hält es die Variablen?

8

Zum Beispiel, warum funktioniert das?

%Vor%

Wenn innerfunc in func2 aufgerufen wird, woher kennt es die Werte von func1var ?

    
user e to the power of 2pi 16.08.2011, 13:20
quelle

3 Antworten

6

Python geht tatsächlich etwas dafür ein, dies für Sie zu tun. Wenn Sie eine Funktion in einer Funktion definieren, können Sie Variablen aus der äußeren Funktion in der inneren Funktion verwenden. Dies gilt für jede Verschachtelungstiefe (das heißt, Sie können eine Funktion innerhalb einer Funktion innerhalb einer Funktion haben ... bis zu einer beliebigen Tiefe ... und die innerste Funktion kann Variablen aus einer der umschließenden Funktionen verwenden). Wenn widersprüchliche Namen vorhanden sind, wird die innerste Variable mit dem angeforderten Namen verwendet.

Außerdem erfasst Python alle von Ihnen verwendeten Variablen aus der äußeren Funktion und speichert sie in der inneren Funktion, die als Closure bezeichnet wird. Sie können also nicht nur eine Funktion an eine andere Funktion übergeben, Wie Sie es tun, aber Sie können eine Funktion aus einer Funktion zurückgeben, und Variablen, die Sie aus der äußeren Funktion verwenden, die beim Definieren der Funktion in Kraft waren, sind dennoch von der zurückgegebenen Funktion aus zugänglich Die äußere Funktion läuft nicht mehr. Dies ist eine ziemlich fortgeschrittene Funktion, aber Sie können so etwas tun:

%Vor%

Diese Funktion ist eine Funktion, die eine Funktion erstellt , die den angegebenen Wert hinzufügt. Zum Beispiel:

%Vor%

In diesem Fall wird der Wert, den Sie an make_adder übergeben, erfasst und in der Funktion gespeichert, die zurückgegeben wird. Auf diese Weise können Sie eine Reihe von Funktionen erstellen, die ihren Argumenten eine beliebige Zahl hinzufügen. Das ist ein triviales Beispiel, das im wirklichen Leben eigentlich nicht sehr nützlich ist, aber dazu dient, das Feature zu veranschaulichen.

    
kindall 16.08.2011, 13:43
quelle
7

Sie haben eine Sperrung erstellt. Betrachten wir es im Grunde so, aus der Sicht der inneren Funktion:

%Vor%

Es ist nicht wichtig, ob func1var in einem äußeren oder globalen Bereich ist - es sucht nur in jedem Bereich nach außen, beginnend mit seinem eigenen lokalen Bereich. Es ist genau so, als wenn Sie eine globale Modulvariable innerhalb einer Klasse oder Funktion in diesem Modul referenzieren.

    
agf 16.08.2011 13:29
quelle
2

Bei jedem Aufruf von func1(func1var) erstellt Python eine neue Funktion innerfunc() . Da func1var perfekt definiert ist, wenn innerfunc() erstellt wird, enthält der Code der neuen Funktion innerfunc() den korrekten Wert von func1var .

    
EOL 16.08.2011 13:28
quelle