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.
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:
In Python2 müssen Sie auf einen Trick zurückgreifen, z. B. param1 in einer Liste (oder einem anderen veränderbaren Objekt) übergeben:
%Vor%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%