Beim Lesen der Dokumentation verstehe ich, dass Python einen separaten Namespace für Funktionen hat. Wenn ich in dieser Funktion eine globale Variable verwenden möchte, muss ich diese verwenden global
.
Ich benutze Python 2.7 und habe diesen kleinen Test ausprobiert
>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
... return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'
Es scheint, dass die Dinge auch ohne gut funktionieren global
. Ich konnte problemlos auf globale Variablen zugreifen.
Vermisse ich etwas Folgendes stammt aus der Python-Dokumentation:
In einer globalen Anweisung aufgeführte Namen dürfen nicht als formale Parameter oder in einem for-Regelkreisziel, einer Klassendefinition, einer Funktionsdefinition oder einer Importanweisung definiert werden.
Während formale Parameter und Klassendefinition für mich sinnvoll sind, kann ich die Einschränkung für die Ziel- und Funktionsdefinition der Schleifensteuerung nicht verstehen.
def foo(): ...
undfoo = ...
gleichzeitig). Es wird für jeden Funktionsaufruf ein neuer Bereich erstellt. (Aber wie unterscheidet sich dies von etwa jeder anderenAntworten:
Das Schlüsselwort
global
ist nur nützlich, um globale Variablen in einem lokalen Kontext zu ändern oder zu erstellen, obwohl das Erstellen globaler Variablen selten als gute Lösung angesehen wird.Das Obige gibt Ihnen:
Wenn Sie die
global
Anweisung verwenden, wird die Variable "außerhalb" des Funktionsumfangs verfügbar und wird effektiv zu einer globalen Variablen.Der obige Code gibt Ihnen also:
Aufgrund der Natur von Python können Sie außerdem
global
Funktionen, Klassen oder andere Objekte in einem lokalen Kontext deklarieren. Obwohl ich davon abraten würde, da es Albträume verursacht, wenn etwas schief geht oder debuggt werden muss.quelle
globals
automatisch in allen Namespaces definiert wird (zum Glück). Wie Sie richtig ausgeführt haben, ist ein Global an einen Namespace innerhalb eines Moduls gebunden, kann jedoch alsfrom module import variable
oder in ein anderes Modul importiert werdenimport module.variable
. Im ersten Fall würde der Import die Variable als zugänglich machen,variable
ohne dass eine Referenz erforderlich wäremodule.
. Ob es im Umfang des Moduls als global betrachtet wird, hängt davon ab, wo es importiert wird. Siehe auchnonlocal
als neuesWährend Sie ohne das
global
Schlüsselwort auf globale Variablen zugreifen können , müssen Sie das Schlüsselwort verwenden, wenn Sie sie ändern möchtenglobal
. Zum Beispiel:In Ihrem Fall greifen Sie nur auf die Liste zu
sub
.quelle
foo = 3
Ohne globale Werke, aber foo wird lokal imblub
Funktionsumfang neu definiert und ändert die ursprüngliche foo-Variable nicht. Das war ziemlich verwirrend für mich.Dies ist der Unterschied zwischen dem Zugriff auf den Namen und dem Binden innerhalb eines Bereichs.
Wenn Sie nur nach einer Variablen suchen, um ihren Wert zu lesen, haben Sie Zugriff auf den globalen und den lokalen Bereich.
Wenn Sie jedoch einer Variablen zuweisen, deren Name nicht im lokalen Bereich liegt, binden Sie diesen Namen in diesen Bereich (und wenn dieser Name auch als globaler Name vorhanden ist, wird er ausgeblendet).
Wenn Sie dem globalen Namen zuweisen möchten, müssen Sie den Parser anweisen, den globalen Namen zu verwenden, anstatt einen neuen lokalen Namen zu binden. Dies ist das Schlüsselwort 'global'.
Durch das Binden an einer beliebigen Stelle innerhalb eines Blocks wird der Name überall in diesem Block gebunden, was einige seltsam aussehende Konsequenzen haben kann (z. B. UnboundLocalError, das plötzlich in zuvor funktionierendem Code erscheint).
quelle
Die anderen Antworten beantworten Ihre Frage. Eine weitere wichtige Information über Namen in Python ist, dass sie je nach Gültigkeitsbereich entweder lokal oder global sind.
Betrachten Sie dies zum Beispiel:
Sie können wahrscheinlich davon ausgehen, dass die
value = 0
Anweisung einer lokalen Variablen zugewiesen wird und den Wert derselben Variablen, die außerhalb derdoit()
Funktion deklariert wurde, nicht beeinflusst . Sie werden möglicherweise mehr überrascht sein, wenn Sie feststellen, dass der obige Code nicht ausgeführt wird. Die Anweisungprint value
innerhalb der Funktion erzeugt eineUnboundLocalError.
Der Grund dafür ist, dass Python bemerkt hat, dass Sie an anderer Stelle in der Funktion den Namen zuweisen
value
, und auchvalue
nirgends deklariert wirdglobal
. Das macht es zu einer lokalen Variablen. Wenn Sie jedoch versuchen, es zu drucken, wurde der lokale Name noch nicht definiert. Python greift in diesem Fall nicht wie bei einigen anderen Sprachen auf die Suche nach dem Namen als globale Variable zurück. Grundsätzlich können Sie nicht auf eine globale Variable zugreifen, wenn Sie irgendwo in der Funktion eine lokale Variable mit demselben Namen definiert haben .quelle
global
(odernonlocal
in Python 3.x) überschreibt dieses Verhalten und ermöglicht es Ihnen, den externen Namen neu zuzuweisen.let
ist nicht gehisst.global
oder spielt es keine Rolle?Der Zugriff auf einen Namen und die Zuweisung eines Namens sind unterschiedlich. In Ihrem Fall greifen Sie nur auf einen Namen zu.
Wenn Sie einer Variablen innerhalb einer Funktion zuweisen, wird angenommen, dass diese Variable lokal ist, es sei denn, Sie deklarieren sie als global. In Ermangelung dessen wird angenommen, dass es global ist.
quelle
global
Beispiel:
quelle
Jede außerhalb einer Funktion deklarierte Variable wird als global angenommen. Nur wenn Sie sie innerhalb von Funktionen deklarieren (außer Konstruktoren), müssen Sie angeben, dass die Variable global ist.
quelle
Dies wird in den Python-FAQ gut erklärt
https://docs.python.org/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
quelle
Dies bedeutet, dass Sie Folgendes nicht tun sollten:
quelle
Global macht die Variable "Global"
Dadurch verhält sich 'x' wie eine normale Variable außerhalb der Funktion. Wenn Sie das Global herausnehmen, wird ein Fehler ausgegeben, da keine Variable innerhalb einer Funktion gedruckt werden kann.
quelle