305 Stimmen

UnboundLocalError bei lokaler Variable, wenn diese nach der ersten Verwendung neu zugewiesen wird

Der folgende Code funktioniert wie erwartet sowohl in Python 2.5 als auch in 3.0:

a, b, c = (1, 2, 3)

print(a, b, c)

def test():
    print(a)
    print(b)
    print(c)    # (A)
    #c+=1       # (B)
test()

Wenn ich jedoch die Zeile (B) erhalte ich eine UnboundLocalError: 'c' not assigned auf der Linie (A) . Die Werte von a et b korrekt gedruckt werden. Das hat mich aus zwei Gründen völlig verwirrt:

  1. Warum wird ein Laufzeitfehler in der Zeile (A) wegen einer späteren Aussage in der Zeile (B) ?

  2. Warum sind Variablen a et b wie erwartet gedruckt, während c einen Fehler auslöst?

Die einzige Erklärung, die mir einfällt, ist, dass ein . variabel c wird durch den Auftrag c+=1 die Vorrang vor der "globalen" Variable hat c noch bevor die lokale Variable erstellt wird. Natürlich ist es nicht sinnvoll, dass eine Variable den Geltungsbereich "stiehlt", bevor sie existiert.

Könnte mir jemand dieses Verhalten erklären?

0 Stimmen

1 Stimmen

0voto

Harun ERGUL Punkte 5306

Der beste Weg, eine Klassenvariable zu erreichen, ist der direkte Zugriff über den Klassennamen

class Employee:
    counter=0

    def __init__(self):
        Employee.counter+=1

0voto

izilotti Punkte 4631

Dieses Problem kann auch auftreten, wenn die del Schlüsselwort wird nach der Initialisierung auf die Variable angewandt, typischerweise in einer Schleife oder einem bedingten Block.

-1voto

Qinsheng Zhang Punkte 856

Das gleiche Problem stört mich. Verwendung von nonlocal y global kann das Problem lösen.
Es ist jedoch darauf zu achten, dass die Verwendung von nonlocal funktioniert es für verschachtelte Funktionen. Auf Modulebene funktioniert es jedoch nicht. Siehe Beispiele hier.

-1voto

JGFMK Punkte 7643

Sie können diese Meldung auch erhalten, wenn Sie eine Variable mit demselben Namen wie eine Methode definieren.

Zum Beispiel:

def teams():
    ...

def some_other_method():
    teams = teams()

Die Lösung ist, die Methode umzubenennen teams() zu etwas anderem wie get_teams() .

Da sie nur lokal verwendet wird, ist die Python-Meldung eher irreführend!

Um das Problem zu umgehen, muss man so vorgehen:

def teams():
    ...

def some_other_method():
    teams = get_teams()

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