Python Globale/lokale Variablen
Warum hat dieser code funktioniert:
var = 0
def func(num):
print num
var = 1
if num != 0:
func(num-1)
func(10)
aber dieser gibt eine "lokale variable 'var' referenced before assignment" Fehler:
var = 0
def func(num):
print num
var = var
if num != 0:
func(num-1)
func(10)
Siehe Antwort und seine Kommentare für eine Diskussion auf, warum dies so ist.
mögliche Duplikate von Kurze Beschreibung des Python-Scoping-Regeln
mögliche Duplikate von Kurze Beschreibung des Python-Scoping-Regeln
InformationsquelleAutor JJ Beck | 2012-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil in der ersten code, den Sie erstellt haben, eine lokale variable
var
und verwendet seinen Wert, in der Erwägung, dass in der 2. code, verwenden Sie die lokale variablevar
, ohne es zu definieren.So, wenn Sie wollen, um Ihren 2. Funktion funktioniert, müssen Sie erklären : -
in der Funktion vor der Verwendung
var
.In der Erwägung, dass in diesem code:
UPDATE: -
Jedoch, wie pro @Tim ' s Kommentar, Sie sollten nicht mit einem
global
variable innerhalb von Funktionen. Eher deifine Ihre variable vor der Verwendung, um es inlocal scope
. Im Allgemeinen sollten Sie versuchen zulimit
den Umfang Ihrer Variablen zulocal
, und auch inlocal
namespacelimit
der Gültigkeitsbereich von lokalen Variablen, weil so der code leichter zu verstehen.Desto mehr erhöhen Sie den Umfang Ihrer Variablen, desto mehr sind die Chancen, die es verwendet, die von der externen Quelle, wo es nicht benötigt wird, verwendet werden.
Ok. Können Sie bitte geben Sie einen besonderen Grund?
Nein, er ist mit der lokalen variable auf die Rechte Seite im zweiten Beispiel, das ist, warum es ein Fehler; es ist noch nicht definiert.
Ja, ich habe es gemischt. Bearbeitet. vielen Dank 🙂
Einige Gründe, nicht zur Verwendung globaler Variablen: c2.com/cgi/wiki?GlobalVariablesAreBad (aber es ist erwähnenswert, dass in Python, die Ihre top-level-Funktionen und-Klassen sind eigentlich Globale Variablen, das ist ein Beispiel dafür, warum Sie nicht wollen, dass da eine harte und schnelle Regel, sondern als eine Heuristik).
InformationsquelleAutor Rohit Jain
Wenn Sie
var = ...
irgendwo in einer Funktion, der name "var" wird behandelt wie eine lokale variable für die gesamte Funktion, unabhängig davon, wo diese Zuweisung erfolgt. Dies bedeutet, dass alle vorkommen vonvar
in Ihrer Funktion aufgelöst werden und in den lokalen Bereich, also auf der rechten Seite desvar = var
Ergebnisse, auf die verwiesen wird vor der Zuweisung Fehler, davar
wurde noch nicht initialisiert in der Funktion Bereich.func
wäre eine Schliessung übervar
ist, und dass dievar = var
Linie hätte eine Funktion die lokale variablevar
und zugeordnet es der Wert der Modul-Ebenevar
. Die "irgendwo in einer Funktion" Teil Ihrer Antwort, die Gerüche magisch zu mir. Das ist wohl nicht die eigentliche Ursache?es ist etwas Magisches. Der Geltungsbereich von Namen ist statisch, im Gegensatz zu gerade über alles anderes.
Python hat nicht wirklich Variablen in dem Sinne, den du denkst; es hat den Namen-Bindungen. Für die meisten einfachen Fällen, der Effekt ist der gleiche, aber es bedeutet, dass einige Fälle sind etwas verwirrend, bis Sie verstehen den Unterschied. Insbesondere, wenn Sie gelernt haben, die Regeln für "wie Verschlüsse arbeiten in dynamischen Sprachen" von Javascript, die Sie gehen, um sein geworfen von Python.
Eigentlich habe ich gelernt, dass alles in Python. Ich bin vertraut mit dem Namen " Bindungen "pass durch die Objekt-Referenz", etc. Es ist nur so, ich hatte nicht gesehen, dass dieser Fall vor, und es ist nicht wie ich erwartet hätte.
Nun habe ich gelesen, ein wenig mehr zu erweitern, F. J Antwort: - Variablen Hinzugefügt werden, um eine Funktion aus der Liste der lokalen Variablen (in der
co_varnames
Attribut) bei der Kompilierung, wenn Sie verwendet werden auf der linken Seite einer Zuweisung. Dies führt zu (für mich!) interessante Situationen wiedef foo(): var = var
scheitern aberdef foo(): exec('var = var')
tadellos in Ordnung. Ich würde beschreiben dies als eher ein Implementierungsdetail einer Optimierung passieren als ein Merkmal der Sprache an sich.InformationsquelleAutor Andrew Clark
Können Sie Lesen eine global deklarieren global. Aber zu schreiben, eine Globale, müssen Sie es erklären, global.
var
ohne Sie zu deklarieren global in diesem Fall, denn er hat einen lokalen Namen, überschattet es.InformationsquelleAutor user1277476
In Ihrem zweiten Stück code, den Sie erstellt haben, eine lokale variable in RHS und, ohne es zu definieren, weisen Sie es auf die LHS variable
var
die global definierte variable außerhalb der Funktion als global explizit).Wenn Ihre Absicht ist, erstellen Sie eine lokale variable innerhalb der Funktion und weisen Sie den Wert der globalen Variablen, wird dies den trick tun:
InformationsquelleAutor TechnoTech
wie über dieses?
ich wollen, verwenden Sie die lokale 'code', um die nächste Funktion einfügen das Ergebnis der barcode auf meinem Tkinter entryBox..
Dank
InformationsquelleAutor Bonifasius Kristiawan
Jede Funktion block einen lokalen Bereich. Wenn Sie möchten, weisen Sie der globalen Variablen, die Sie benötigen, zu tun, so ausdrücklich:
Ich weiß gar nicht, was Sie Lesen an dieser Stelle. Die OP ' s erste Beispiel nicht eine Ausnahme—in der Tat, das ist der ganze Grund, er kam hier diese Frage zu stellen.
Die Frage war über das zweite Beispiel, nicht die erste. Es gibt keinen Grund, für die erste zu werfen Ausnahmen... @RohitJain erklärt, warum das zweite Beispiel löst eine Ausnahme aus. Ich bin mir immer noch nicht sicher, warum Sie denken, dass diese Antwort impliziert, dass das erste Beispiel nicht funktionieren sollte.
Es fühlt sich wie Sie versuchen zu Punkten, anstatt geben nützliche Informationen. Sie haben einen entfernten Kommentar und bearbeitet Ihre Antwort in einer Weise, die machen meine Kommentare scheinen sinnlos, aber Ihre Antwort noch nicht die OP ' s Verwirrung auf allen, oder zu erklären, alles, was fehlt, aus den zwei vorhandenen nützlichen Antworten. Ich bin fertig kommentieren hier.
Die OP hat den Zweck, in der zweiten Funktion ist mehrdeutig: er könnte versuchen zu Lesen die Globale var, oder er könnte versuchen, Sie, oder beide. Da er nicht alle zusätzlichen input da die Frage zu stellen, keiner von uns sicher weiß, was er versuchte zu erreichen. Ich nahm die Falle, die versuchen, die Globale var, und Sie übernahm die andere. Ich bearbeitet habe, die Antwort, die deutlicher machen, und entfernt mein Erster Kommentar, weil es nicht konstruktiv ist. Und übrigens, diese ganze Kommentar-thread nicht sehr konstruktiv... Also lasst uns einfach aufhören.
InformationsquelleAutor Nisan.H