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.