Python-Closure-Funktion verliert äußeren Variablenzugriff

8

Ich habe gerade Python @ Decorator gelernt, es ist cool, aber bald fand ich meinen modifizierten Code komische Probleme herauskommen.

%Vor%

Ich debugge es, es wirft Ausnahme bei print param1

aus %Vor%

Wenn ich param1 = 'new' diese Zeile entferne, ohne irgendeinen Änderungsvorgang (Verknüpfung mit einem neuen Objekt) auf Variablen aus dem äußeren Bereich, könnte diese Routine funktionieren.

Bedeutet das, dass ich nur eine Kopie der äußeren Scope-Variablen gemacht habe, dann mache ich eine Modifikation?

Danke Delnan, es ist wichtig zu schließen. Wahrscheinliche Antwort von hier: Welche Einschränkungen haben Closures in Python im Vergleich zu Sprache X? Schließungen?

Ähnlicher Code wie:

%Vor%

Und auch das scheint die vorherige nervige globale Variable:

%Vor%

Dies wird durch das Symbol global behoben. Aber für die Schließung, kein solches Symbol gefunden. Danke unutbu, Python 3 gab uns nonlocal .

Ich weiß von oben, dass der direkte Zugriff auf die äußere Variable schreibgeschützt ist. aber es ist ein wenig unangenehm zu sehen, dass vorhergehende Lesevariable (print var) ebenfalls betroffen ist.

    
V.E.O 29.08.2012, 16:04
quelle

3 Antworten

11

Wenn Python eine Funktion analysiert, merkt sie sich immer dann, wenn sie eine Variable auf der linken Seite einer Zuweisung findet, zB

%Vor%

Es wird vorausgesetzt, dass alle diese Variablen lokal für die Funktion sind. Also, wenn Sie dieser Aufgabe mit

vorausgehen %Vor%

Es tritt ein Fehler auf, weil Python zum Zeitpunkt der Ausführung der print-Anweisung keinen Wert für diese lokale Variable hat.

In Python3 können Sie das beheben, indem Sie param1 nichtlokal:

deklarieren %Vor%

In Python2 müssen Sie auf einen Trick zurückgreifen, z. B. param1 in einer Liste (oder einem anderen veränderbaren Objekt) übergeben:

%Vor%     
unutbu 29.08.2012, 16:11
quelle
1

Wenn Sie eine Variable aus dem äußeren Bereich in Python 2.x erfassen wollen, dann ist die Verwendung von global auch eine Option (mit den üblichen Vorbehalten - aber praktisch für temporäre Situationen oder explorativen Code).

Während der folgende Befehl (die Zuweisung von upper1 innerhalb von inner ist, führt dazu, dass er in der if-Bedingung lokal und daher unbegrenzt ist):

%Vor%

Das wird nicht:

%Vor%     
DavidJ 17.07.2015 13:29
quelle
0

Sie weisen param1 in der Funktion zu, was param1 zu einer lokalen Variable macht. Es wurde jedoch nicht an dem Punkt zugewiesen, an dem Sie es drucken, daher wird ein Fehler angezeigt. Python sucht nicht nach Variablen in äußeren Bereichen.

    
kindall 29.08.2012 16:12
quelle

Tags und Links