it-swarm.com.de

Python 3: UnboundLocalError: lokale Variable, auf die vor der Zuweisung verwiesen wird

Der folgende Code gibt den Fehler UnboundLocalError: local variable 'Var1' referenced before assignment an:

Var1 = 1
Var2 = 0
def function(): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    Elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    Elif Var1 < 1:
        print("Result Three")
    Var1 =- 1
function()

Wie kann ich das beheben? Danke für jede Hilfe!

154
Eden Crow

Sie können dies beheben, indem Sie Parameter übergeben, anstatt sich auf Globals zu verlassen

def function(Var1, Var2): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    Elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    Elif Var1 < 1:
        print("Result Three")
    return Var1 - 1
function(1, 1)
42
Jakob Bowyer

Dies liegt daran, dass Sie, obwohl Var1 vorhanden ist, auch eine Zuweisungsanweisung für den Namen Var1 innerhalb der Funktion verwenden (Var1 -= 1 in der unteren Zeile). Dadurch wird natürlich eine Variable innerhalb des Funktionsbereichs mit dem Namen Var1 erstellt (wahrheitsgemäß wird mit -= oder += nur eine vorhandene Variable aktualisiert (neu zugewiesen), dies jedoch aus unbekannten Gründen (wahrscheinliche Konsistenz in dieser Hinsicht) Kontext), Python behandelt es als eine Zuweisung). Der Python -Interpreter erkennt dies beim Laden des Moduls und entscheidet (korrekterweise), dass der Var1 des globalen Bereichs nicht innerhalb des lokalen Bereichs verwendet werden soll, was zu einem Problem führt, wenn Sie versuchen, auf den zu verweisen Variable, bevor es lokal zugewiesen wird.

Die Verwendung globaler Variablen außerhalb der Notwendigkeit wird normalerweise von Python Entwicklern verpönt, da dies zu verwirrendem und problematischem Code führt. Wenn Sie sie jedoch verwenden möchten, um das zu erreichen, was Ihr Code impliziert, können Sie einfach Folgendes hinzufügen:

global Var1, Var2

in der Spitze Ihrer Funktion. Dies teilt Python mit, dass Sie keine Var1- oder Var2 -Variable innerhalb des lokalen Bereichs der Funktion definieren möchten. Der Python -Interpreter erkennt dies zum Zeitpunkt des Ladens des Moduls und beschließt (richtig), alle Verweise auf die oben genannten Variablen im globalen Bereich nachzuschlagen.

Einige Ressourcen

  • die Python Website enthält ein gute Erklärung für dieses häufige Problem.
  • Python 3 bietet eine verwandte nonlocal -Anweisung - überprüfen Sie dies ebenfalls.
364
orokusaki

Wenn Sie den Wert einer Variablen in der Funktion festlegen, versteht python, dass eine lokale Variable mit diesem Namen erstellt wird. Diese lokale Variable maskiert die globale Variable.

In Ihrem Fall wird Var1 als lokale Variable betrachtet und vor dem Setzen verwendet, daher der Fehler.

Um dieses Problem zu lösen, können Sie explizit sagen, dass es sich um ein globales Problem handelt, indem Sie global Var1 in Ihre Funktion einfügen.

Var1 = 1
Var2 = 0
def function():
    global Var1
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    Elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    Elif Var1 < 1:
        print("Result Three")
    Var1 =- 1
function()
72
madjar

Ich mag dieses Verhalten nicht, aber so funktioniert Python. Die Frage wurde bereits von anderen beantwortet, aber der Vollständigkeit halber möchte ich darauf hinweisen, dass Python 2 mehr solche Macken hat.

def f(x):
    return x

def main():
    print f(3)
    if (True):
        print [f for f in [1, 2, 3]]

main()

Python 2.7.6 gibt einen Fehler zurück:

Traceback (most recent call last):
  File "weird.py", line 9, in <module>
    main()
  File "weird.py", line 5, in main
    print f(3)
UnboundLocalError: local variable 'f' referenced before assignment

Python erkennt, dass f als lokale Variable in [f for f in [1, 2, 3]] verwendet wird, und entscheidet, dass es sich auch um eine lokale Variable in f(3) handelt. Sie könnten eine global f -Anweisung hinzufügen:

def f(x):
    return x

def main():
    global f
    print f(3)
    if (True):
        print [f for f in [1, 2, 3]]

main()

Es funktioniert; jedoch f wird am Ende zu 3 ... Das heißt, print [f for f in [1, 2, 3]] ändert jetzt die globale Variable f in 3, so dass es keine Funktion ist Mehr.

Glücklicherweise funktioniert es in Python3 einwandfrei, nachdem die Klammern zu print hinzugefügt wurden.

9
osa

Warum nicht einfach den berechneten Wert zurückgeben und den Aufrufer die globale Variable ändern lassen? Es ist keine gute Idee, eine globale Variable in einer Funktion wie folgt zu manipulieren:

Var1 = 1
Var2 = 0

def function(): 
    if Var2 == 0 and Var1 > 0:
        print("Result One")
    Elif Var2 == 1 and Var1 > 0:
        print("Result Two")
    Elif Var1 < 1:
        print("Result Three")
    return Var1 - 1

Var1 = function()

oder sogar lokale Kopien der globalen Variablen erstellen und damit arbeiten und die Ergebnisse zurückgeben, die der Aufrufer dann entsprechend zuweisen kann

def function():
v1, v2 = Var1, Var2
# calculate using the local variables v1 & v2
return v1 - 1

Var1 = function()
2
ctx