Das ist ein seltsames Verhalten.
Versuchen Sie Folgendes:
%Vor%Warum Liste muss nicht global deklarieren? sind sie automatisch global?
Ich finde es wirklich seltsam, ich benutze die Liste der meisten Zeit und ich benutze überhaupt nicht global zu uns als global ....
Es ist nicht automatisch global.
Allerdings gibt es einen Unterschied zwischen rep_i=1
und rep_lst[0]=1
- der frühere bindet den Namen rep_i
, also wird global
benötigt, um die Erstellung eines lokalen Slots mit demselben Namen zu verhindern. In letzterem Fall modifizierst du nur ein existierendes, globales Objekt, das beim normalen Namenssuchen gefunden wird (das Ändern eines Listeneintrags ist wie das Aufrufen einer Elementfunktion in der Liste, es ist kein Name, der wieder bindet).
Um es auszuprobieren, versuchen Sie rep_lst=[]
in test2
zuzuweisen (d. h., legen Sie es auf eine neue Liste fest). Wenn Sie rep_lst
global
nicht deklarieren, sind die Effekte außerhalb von test2
nicht sichtbar, da ein lokaler Slot mit demselben Namen erstellt wird und den globalen Slot schattiert.
Sie müssen nur global
verwenden, wenn Sie dem globalen Namen zuweisen. Ohne global
erstellt eine Zuweisung ein neues lokales.
Es gibt nichts Besonderes daran, wie global
auf eine Liste angewendet wird. global
beeinflusst einfach die Auflösung von Bereichen und Namen.
Es gibt einen Fehler in Python namens UnboundLocalError
, der Neulinge oft verwirrt. Das Verwirrende ist: future Zuweisung ändert die Art, wie eine Variable nachgeschlagen wird.
Wenn der Interpreter einen Variablennamen zum ersten Mal sieht, schaut er auf das Ende des aktuellen Codeblocks, und wenn Sie innerhalb desselben Codeblocks keine Zuweisung zu ihm haben, betrachtet der Interpreter es als global . Wenn Sie dies jedoch tun, wird es als lokal betrachtet, und jede Bezugnahme darauf vor der Zuweisung erzeugt ein UnboundLocalError
. Das ist der Fehler, den du hast. Deshalb müssen Sie global rep_i
deklarieren. Wenn Sie rep_i
nicht zugewiesen haben, benötigen Sie diese Zeile nicht.
Auch das hat nichts mit Variablentyp zu tun. Auch das Zuweisen oder Anhängen eines Elements an die Liste (was Sie wahrscheinlich tun wollten, aber nicht taten), ist nicht die Zuweisung der Liste selbst, sondern das Aufrufen einer Methode für ein Listenobjekt, das sich von der Zuweisung unterscheidet: Zuweisung erstellt ein neues Objekt (möglicherweise unter einem Namen, der bereits existiert), während das Manipulieren einer Liste nur eine bestehende Liste ändert. Sie können versuchen:
%Vor% Wenn Sie rep_lst
innerhalb von test2
(nicht nur einem seiner Elemente, wie Sie es getan haben) einen neuen Wert zugewiesen hätten, würde es ohne das global
Flag nicht funktionieren. Wenn Sie in Python keiner Variablen innerhalb einer Funktion eine Funktion zuweisen, sucht sie diese Variable in mehr globalen Bereichen, bis sie gefunden wird.
Beispielsweise definiere ich in diesem Codesegment die Liste sowohl global als auch innerhalb von example()
. Da die Variable in example()
näher an example2()
liegt als die globale, wird sie verwendet.
Das hat nichts mit Listen zu tun, sondern ist das Verhalten jeder Variablen in Python.
Hier ist ein Beispiel, das zeigt, dass eine non list
/ dict
Variable in einer Subroutine verfügbar ist, und das Problem ist, wie alle sagen, der Vorgang von rebinding
in Ihrem ursprünglichen Codebeispiel:
Sie werden sehen, dass 2
ausgedruckt wird, obwohl x
nicht als global deklariert ist.
Tags und Links python list python-2.7 global