Warum ist in Python list [] automatisch global?

8

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 ....

    
Phyo Arkar Lwin 13.06.2011, 10:57
quelle

5 Antworten

12

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.

    
Alexander Gessler 13.06.2011, 11:00
quelle
5

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.

    
David Heffernan 13.06.2011 10:59
quelle
3

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%     
letitbee 13.06.2011 11:17
quelle
2

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.

%Vor%

Das hat nichts mit Listen zu tun, sondern ist das Verhalten jeder Variablen in Python.

    
Jeremy Banks 13.06.2011 11:02
quelle
2

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:

%Vor%

Sie werden sehen, dass 2 ausgedruckt wird, obwohl x nicht als global deklariert ist.

    
mkomitee 13.06.2011 11:40
quelle

Tags und Links