referenziert vor Zuweisungsfehler in Python

76

In Python wird folgende Fehlermeldung angezeigt:

UnboundLocalError: local variable 'total' referenced before assignment

Am Anfang der Datei (vor der Funktion, von der der Fehler stammt) deklariere ich 'total' mit dem globalen Schlüsselwort. Dann, im Hauptteil des Programms, bevor die Funktion, die 'total' verwendet, aufgerufen wird, weise ich sie 0 zu. Ich habe versucht, sie an verschiedenen Stellen auf 0 zu setzen (einschließlich des oberen Teils der Datei, unmittelbar nachdem sie deklariert wurde ), aber ich kann es nicht zum Laufen bringen. Hat jemand gesehen, was ich falsch mache?

Jeremy
quelle
4
Erklären Sie global in der Funktion?
Nikhil Chelliah

Antworten:

152

Ich denke, Sie verwenden "global" falsch. Siehe Python-Referenz . Sie sollten eine Variable ohne global deklarieren und dann innerhalb der Funktion, wenn Sie auf eine globale Variable zugreifen möchten, diese deklarieren global yourvar.

#!/usr/bin/python

total

def checkTotal():
    global total
    total = 0

Siehe dieses Beispiel:

#!/usr/bin/env python

total = 0

def doA():
    # not accessing global total
    total = 10

def doB():
    global total
    total = total + 1

def checkTotal():
    # global total - not required as global is required
    # only for assignment - thanks for comment Greg
    print total

def main():
    doA()
    doB()
    checkTotal()

if __name__ == '__main__':
    main()

Da doA()die globale Summe nicht geändert wird, ist die Ausgabe 1 nicht 11.

stefanB
quelle
28
Es ist möglicherweise nichts wert, dass Sie das Schlüsselwort "global" nur benötigen, wenn Sie der globalen Variablen innerhalb eines lokalen Bereichs zuweisen. In Ihrem Beispiel ist die globale Deklaration in checkTotal () nicht erforderlich.
Greg Hewgill
1
Umfassende Antwort und eine gründliche Analyse des wesentlichen Missverständnisses hinter der Frage.
Jarret Hardie
3
Ich meinte , es könnte sich lohnen Bemerkens natürlich! Kommentare können immer noch nicht ohne Löschen und Lesen bearbeitet werden. :(
Greg Hewgill
Als ich eine globale Variable deklarierte, musste ich ihr einen Wert zuweisen ( glob_val=NoneIOW, ich konnte ihn ohne Wertzuweisung nicht deklarieren
amphibient
6

Mein Szenario

def example():
    cl = [0, 1]
    def inner():
        #cl = [1, 2] # access this way will throw `reference before assignment`
        cl[0] = 1 
        cl[1] = 2   # these won't

    inner()
Zicken
quelle
0
def inside():
   global var
   var = 'info'
inside()
print(var)

>>>'info'

Problem beendet

Ninja
quelle
2
Es wäre hilfreich zu erklären, wie Ihr Code funktioniert, indem Sie eine einfache Erklärung oder einen Kommentar
abgeben
Die akzeptierte Antwort scheint die Verwendung von globalbereits abgedeckt zu haben .
Calculuswhiz
-1

Ich habe diesen Beitrag durch die Tatsache gefunden, dass ich diesen Fehler selbst in meinem eigenen Code hatte und ich weiß, dass es eine Weile her ist, seit dieser veröffentlicht wurde und Sie bereits einige Antworten und ein behobenes Problem für diese Situation erhalten haben, aber nur erklären wollten, wie ich ihn behoben habe es nur für den Fall, dass es jemand anderem helfen könnte !! Grundsätzlich dachte ich zuerst, dass der Code-Editor, der REPL.it verwendet, etwas für eine Freundin macht und weiß, dass sie sowieso nicht wie ein Code-Editor herunterladen möchte. Der Punkt ist, dass ich dachte, dass es nicht möglich ist. ' Ich behandle den Code nicht, weil die Komplexität zu diesem Zeitpunkt bei 139 lag und danach noch höher wurde. Dann begann ich zu experimentieren und erkannte, dass innerhalb meines Funktionssatzes direkt außerhalb einer echten Schleife innerhalb meiner a_loop-Funktion dieser Buchstabe zum Registrieren definiert werden musste es! Also im Grunde war ich nicht t Definieren Sie den Wert in diesem Fall als Zählfunktion, die sich tatsächlich im Code befindet! Ich würde meinen Code hier teilen, aber es ist irgendwie persönlich wie in den Print-Anweisungen und es ist auch 2349 Zeilen lang und ja, ich hoffe trotzdem, das hilft! Empfehlen Sie auch, wenn Sie in meinem Fall einen Teil des Codes verwenden können, den ich könnte, und setzen Sie mehr Skripte ein, wenn Sie können, um es Ihrem Gehirn leichter zu machen! Ich hoffe noch einmal, dass dies hilft. Wenn Sie Fragen haben, können Sie diese gerne stellen und ich werde nach besten Kräften antworten! Ich hoffe das hilft!!! Setzen Sie mehr Skripte ein, wenn Sie können, um es Ihrem Gehirn leichter zu machen! Ich hoffe noch einmal, dass dies hilft. Wenn Sie Fragen haben, können Sie diese gerne stellen und ich werde nach besten Kräften antworten! Ich hoffe das hilft!!! Setzen Sie mehr Skripte ein, wenn Sie können, um es Ihrem Gehirn leichter zu machen! Ich hoffe noch einmal, dass dies hilft. Wenn Sie Fragen haben, können Sie diese gerne stellen und ich werde nach besten Kräften antworten! Ich hoffe das hilft!!!

-Sam

JediSam B.
quelle