388 Stimmen

Python 3: UnboundLocalError: lokale Variable vor Zuweisung referenziert

Der folgende Code führt zu dem Fehler UnboundLocalError: local variable 'Var1' referenced before assignment :

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?

744voto

orokusaki Punkte 51153

Dies liegt daran, dass, auch wenn Var1 existiert, verwenden Sie auch eine Zuweisungsanweisung für den Namen Var1 innerhalb der Funktion ( Var1 -= 1 in der unteren Zeile). Natürlich wird dadurch eine Variable innerhalb des Funktionsbereichs mit der Bezeichnung Var1 (wahrhaftig, ein -= または += wird nur eine bestehende Variable aktualisieren (neu zuweisen), aber aus unbekannten Gründen (wahrscheinlich Konsistenz in diesem Kontext), behandelt Python es als eine Zuweisung). Der Python-Interpreter sieht dies beim Laden des Moduls und entscheidet (richtigerweise), dass der globale Bereich Var1 sollte nicht innerhalb des lokalen Bereichs verwendet werden, was zu einem Problem führt, wenn Sie versuchen, auf die Variable zu verweisen, bevor sie lokal zugewiesen wird.

Die Verwendung globaler Variablen ist bei Python-Entwicklern normalerweise verpönt, da sie zu verwirrendem und problematischem Code führt. Wenn Sie sie jedoch verwenden möchten, um zu erreichen, was Ihr Code impliziert, können Sie einfach hinzufügen, innerhalb des oberen Teils Ihrer Funktion :

global Var1, Var2

Damit wird Python mitgeteilt, dass Sie nicht beabsichtigen die Definition einer Var1 または Var2 Variable innerhalb des lokalen Bereichs der Funktion. Der Python-Interpreter sieht dies beim Laden des Moduls und beschließt (richtigerweise), alle Verweise auf die oben genannten Variablen im globalen Bereich zu suchen.

Einige Ressourcen

  • die Python-Website hat eine tolle Erklärung für dieses gemeinsame Problem.
  • Python 3 bietet eine verwandte nonlocal Erklärung - überprüfen Sie auch das.

171voto

madjar Punkte 12081

Wenn Sie den Wert einer Variablen innerhalb der Funktion setzen, versteht Python dies als das Anlegen einer lokalen Variable mit diesem Namen. Diese lokale Variable maskiert die globale Variable.

In Ihrem Fall, Var1 wird als lokale Variable betrachtet, und sie wird verwendet, bevor sie gesetzt wird, daher der Fehler.

Um dieses Problem zu lösen, können Sie explizit sagen, dass es sich um ein Global handelt, indem Sie global Var1 in Ihrer Funktion.

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()

105voto

Jakob Bowyer Punkte 32375

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)

14voto

Sergey Orshanskiy Punkte 6434

Ich mag dieses Verhalten nicht, aber so funktioniert Python nun einmal. Die Frage wurde bereits von anderen beantwortet, aber lassen Sie mich der Vollständigkeit halber darauf hinweisen, dass Python 2 noch mehr solcher 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 sieht die f wird als lokale Variable verwendet in [f for f in [1, 2, 3]] und beschließt, dass es sich auch um eine lokale Variable in f(3) . Sie könnten eine global f Erklärung:

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 nun die globale Variable f zu 3 Es handelt sich also nicht mehr um eine Funktion.

Glücklicherweise funktioniert es in Python3, nachdem man die Klammern zu print .

6voto

ctx Punkte 79

Warum geben Sie nicht einfach Ihren berechneten Wert zurück und lassen den Aufrufer die globale Variable ändern? Es ist keine gute Idee, eine globale Variable innerhalb einer Funktion zu manipulieren, wie unten beschrieben:

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, mit ihnen 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()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X