Ich weiß, dass ich aufgrund dieser Verwirrung zunächst die Verwendung globaler Variablen vermeiden sollte. Wenn ich sie jedoch verwenden würde, ist das Folgende ein gültiger Weg, um sie zu verwenden? (Ich versuche, die globale Kopie einer Variablen aufzurufen, die in einer separaten Funktion erstellt wurde.)
x = "somevalue"
def func_A ():
global x
# Do things to x
return x
def func_B():
x = func_A()
# Do things
return x
func_A()
func_B()
Hat das x
, was die zweite Funktion verwendet, den gleichen Wert wie die globale Kopie x
, die func_a
verwendet und geändert wird? Ist beim Aufrufen der Funktionen nach der Definition die Reihenfolge wichtig?
python
global-variables
Akshat Shekhar
quelle
quelle
Antworten:
Wenn Sie einfach auf eine globale Variable zugreifen möchten, verwenden Sie einfach deren Namen. Um den Wert zu ändern , müssen Sie jedoch das
global
Schlüsselwort verwenden.Z.B
Dies würde den Wert der globalen Variablen auf 55 ändern. Andernfalls würde nur einer lokalen Variablen 55 zugewiesen.
Die Reihenfolge der Funktionsdefinitionslisten spielt keine Rolle (vorausgesetzt, sie beziehen sich nicht in irgendeiner Weise aufeinander), die Reihenfolge, in der sie aufgerufen werden.
quelle
x
infunc_B
ist eine lokale Variable, die ihren Wert vom Rückgabewert des Aufrufs anfunc_A
- also denke ich, das würde es zu Ihrem (2) machenfunc_A
die globale Variable während jedes Laufs geändert undfunc_B
zur Verwendung zurückgegeben wird,func_B
wird jedes Mal mit einem geänderten Wert gearbeitet. Ich bin mir nicht sicher, wie Sie das Problem beheben können. Möglicherweise möchten Sie die hilfreichste Antwort auf Ihre aktuelle / ursprüngliche Frage akzeptieren und dann eine andere Frage zu einer Frage stellen, die wie eine Folgefrage aussieht.x.append("...")
, wird die globale Variable x geändert, da die lokale Variable auf die globale verweist.Innerhalb eines Python-Bereichs erstellt jede Zuweisung zu einer Variablen, die nicht bereits in diesem Bereich deklariert wurde, eine neue lokale Variable, es sei denn , diese Variable wurde früher in der Funktion als Verweis auf eine Variable mit globalem Gültigkeitsbereich mit dem Schlüsselwort deklariert
global
.Schauen wir uns eine modifizierte Version Ihres Pseudocodes an, um zu sehen, was passiert:
Tatsächlich könnten Sie alles
func_B
mit der benannten Variablen umschreibenx_local
und es würde identisch funktionieren.Die Reihenfolge ist nur für die Reihenfolge von Bedeutung, in der Ihre Funktionen Operationen ausführen, die den Wert des globalen x ändern. In unserem Beispiel spielt also die Reihenfolge keine Rolle, da
func_B
Anrufefunc_A
. In diesem Beispiel spielt die Reihenfolge eine Rolle:Beachten Sie, dass dies
global
nur zum Ändern globaler Objekte erforderlich ist. Sie können weiterhin von einer Funktion aus auf sie zugreifen, ohne sie zu deklarierenglobal
. So haben wir:Beachten Sie den Unterschied zwischen
create_locally
undaccess_only
- darinaccess_only
besteht, auf das globale x zuzugreifen, obwohl es nicht aufgerufen wirdglobal
, und obwohlcreate_locally
es auch nicht verwendet wirdglobal
, wird eine lokale Kopie erstellt, da ein Wert zugewiesen wird.Die Verwirrung hier ist, warum Sie keine globalen Variablen verwenden sollten.
quelle
Wie andere angemerkt haben, müssen Sie eine Variable
global
in einer Funktion deklarieren, wenn diese Funktion die globale Variable ändern kann. Wenn Sie nur darauf zugreifen möchten, brauchen Sie nichtglobal
.Um etwas näher darauf einzugehen, bedeutet "Ändern" Folgendes: Wenn Sie den globalen Namen neu binden möchten, damit er auf ein anderes Objekt verweist, muss der Name deklariert werden
global
in der Funktion werden.Viele Operationen, die ein Objekt ändern (mutieren), binden den globalen Namen nicht erneut, um auf ein anderes Objekt zu verweisen. Sie sind daher alle gültig, ohne den Namen
global
in der Funktion zu deklarieren .quelle
Hier ist ein Fall, der mich auffiel, als ich einen globalen Wert als Standardwert für einen Parameter verwendete.
Ich hatte erwartet, dass param einen Wert von 42 hat. Überraschung. Python 2.7 hat den Wert von globVar ausgewertet, als die Funktion func zum ersten Mal analysiert wurde. Das Ändern des Werts von globVar hatte keine Auswirkungen auf den Standardwert, der param zugewiesen wurde. Das Verzögern der Auswertung, wie im Folgenden, funktionierte so, wie ich es brauchte.
Oder wenn Sie sicher sein wollen,
quelle
is
zu überprüfen, ob etwas vorhanden ist .None
==
Sie können direkt auf eine globale Variable innerhalb einer Funktion zugreifen. Wenn Sie den Wert dieser globalen Variablen ändern möchten, verwenden Sie "globaler Variablenname". Siehe folgendes Beispiel:
Im Allgemeinen ist dies keine gute Programmierpraxis. Durch das Unterbrechen der Namespace-Logik kann es schwierig werden, Code zu verstehen und zu debuggen.
quelle
Sie müssen die verwenden
global
Deklaration verwenden, wenn Sie den einer globalen Variablen zugewiesenen Wert ändern möchten.Sie brauchen es nicht, um aus einer globalen Variablen zu lesen. Beachten Sie, dass das Aufrufen einer Methode für ein Objekt (auch wenn dadurch die Daten in diesem Objekt geändert werden) den Wert der Variablen, die dieses Objekt enthält, nicht ändert (keine reflektierende Magie).
quelle
xs.append(xs.pop(0))
funktioniert gut ohneglobal xs
.