4 Stimmen

Nicht in der Lage, ein globales int zu ändern, aber kann eine Liste ändern. Wie?

LISTL = [] VAR1 = 0 def foo(): ... VAR1 += 1 ... return VAR1 ...

Beim Aufrufen von foo() erhalte ich diesen Fehler:

UnboundLocalError: lokale Variable 'VAR1' wurde vor der Zuweisung referenziert

Allerdings, beachten Sie die Liste LISTL

>>> def foo(x):
...     LISTL.append(x)
...     return LISTL
... 
>>> foo(5)
[5]

Dies funktioniert wie erwartet. Die Frage ist, warum das Anhängen an eine Liste funktioniert, aber ich den int-Wert nicht ändern kann?

Ist dies auch der richtige Weg, um in Python eine globale Variable zu deklarieren? (Direkt nach den Import-Anweisungen)

5voto

Joseph Spiros Punkte 1274

Der Grund für diesen Unterschied hat mit der Art und Weise zu tun, wie Python die Namen in Namespaces gruppiert. Wenn du dich innerhalb einer Funktionsdefinition (def foo():) befindest und einen Namen AUFRUFST (VAR1 oder LISTL), wird es zuerst im lokalen Namespace suchen, wo es nichts finden wird, und dann wird es im Namespace des Moduls suchen, in dem die Funktion definiert wurde, bis hin zum globalen Namespace, bis es eine Übereinstimmung findet oder fehlschlägt.

Jedoch sind das AUFRUFEN eines Namens und das ZUWEISEN eines Namens zwei verschiedene Konzepte. Wenn du wieder innerhalb deiner Funktionsdefinition bist und sagst VAR1 = 2, deklarierst du eine neue Variable mit dem neuen lokalen Namen VAR1 innerhalb der Funktion. Das macht Sinn, wenn man bedenkt, dass es ansonsten zu Namenskollisionen kommen würde, wenn diese Namensräume nicht funktionieren würden.

Wenn du an eine Liste anhängst, greifst du nur auf die Liste zu und rufst dann eine Methode darauf auf, die zufällig ihren konzeptionellen Wert ändert. Wenn du += verwendest, weist du tatsächlich einem Namen einen Wert zu.

Wenn du Werte Namen zuweisen möchtest, die außerhalb des aktuellen Namensraums definiert sind, kannst du das global Schlüsselwort verwenden. In diesem Fall würdest du innerhalb deiner Funktion zuerst sagen global VAR1, und von da an wäre der Name VAR1 der Name im äußeren Namensraum, und alle Zuweisungen würden außerhalb der Funktion wirksam werden.

4voto

dan04 Punkte 82011

Wenn Sie innerhalb einer Funktion einer Variablen zuweisen, wird angenommen, dass diese Variable lokal ist, es sei denn, Sie deklarieren sie als global.

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