Sie können eine globale Variable in anderen Funktionen verwenden, indem Sie sie wie global
in jeder ihr zugewiesenen Funktion deklarieren :
globvar = 0
def set_globvar_to_one():
global globvar # Needed to modify global copy of globvar
globvar = 1
def print_globvar():
print(globvar) # No need for global declaration to read value of globvar
set_globvar_to_one()
print_globvar() # Prints 1
Ich stelle mir den Grund dafür vor, dass Python, da globale Variablen so gefährlich sind, sicherstellen möchte, dass Sie wirklich wissen, womit Sie spielen, indem Sie das global
Schlüsselwort explizit benötigen .
Weitere Antworten finden Sie, wenn Sie eine globale Variable für mehrere Module freigeben möchten.
global
Schlüsselwort benötigt, weil Globale gefährlich sind. Dies liegt vielmehr daran, dass Sie in der Sprache keine expliziten Variablen deklarieren müssen und automatisch davon ausgehen, dass eine von Ihnen zugewiesene Variable einen Funktionsumfang hat, sofern Sie nichts anderes angeben. Dasglobal
Schlüsselwort ist das Mittel, das bereitgestellt wird, um es anders zu sagen.f2()
f3()
Wenn ich Ihre Situation richtig verstehe, sehen Sie, wie Python mit lokalen (Funktion) und globalen (Modul) Namespaces umgeht.
Angenommen, Sie haben ein Modul wie dieses:
Man könnte erwarten dies 42, zu drucken , sondern druckt es 5. Wie bereits erwähnt, wenn Sie eine ‚hinzufügen
global
‘ Erklärung zufunc1()
, dannfunc2()
wird 42 drucken.Was hier vor sich geht, ist, dass Python davon ausgeht, dass jeder Name, der irgendwo innerhalb einer Funktion zugewiesen wird, lokal für diese Funktion ist, sofern nicht ausdrücklich anders angegeben. Wenn nur von einem Namen gelesen wird und der Name lokal nicht vorhanden ist, wird versucht, den Namen in einem beliebigen Bereich nachzuschlagen (z. B. im globalen Bereich des Moduls).
Wenn Sie dem Namen 42 zuweisen
myGlobal
, erstellt Python daher eine lokale Variable, die die gleichnamige globale Variable schattiert. Dieser lokale Bereich ist nicht mehr gültig und wird bei derfunc1()
Rückgabe mit Müll gesammelt . In der Zwischenzeitfunc2()
kann nie etwas anderes als der (unveränderte) globale Name angezeigt werden. Beachten Sie, dass diese Namespace-Entscheidung zur Kompilierungszeit und nicht zur Laufzeit erfolgt. Wenn Sie den Wert vonmyGlobal
inside lesen,func1()
bevor Sie ihn zuweisen, erhalten Sie eineUnboundLocalError
, da Python bereits entschieden hat, dass es sich um eine lokale Variable handeln muss hat noch keinen Wert damit verbunden. Mit derglobal
Anweisung ' ' teilen Sie Python jedoch mit, dass der Name an anderer Stelle gesucht werden soll, anstatt ihn lokal zuzuweisen.(Ich glaube, dass dieses Verhalten größtenteils durch die Optimierung lokaler Namespaces entstanden ist. Ohne dieses Verhalten müsste Pythons VM jedes Mal, wenn ein neuer Name innerhalb einer Funktion zugewiesen wird, mindestens drei Namenssuchen durchführen (um sicherzustellen, dass der Name nicht vorhanden ist.) t existieren bereits auf Modul- / eingebauter Ebene), was einen sehr häufigen Vorgang erheblich verlangsamen würde.)
quelle
MyGlobal = 5
x
lokal ist, unterscheidet sich von der Überprüfung zur Laufzeit, ob der lokale Name an einen Wert gebunden wurde, bevor er zum ersten Mal verwendet wird.MY_GLOBAL = 5
. Weitere Informationen finden Sie im Style Guide für Python-Code .Vielleicht möchten Sie den Begriff der Namespaces untersuchen . In Python ist das Modul der natürliche Ort für globale Daten:
Eine spezifische Verwendung von Global-in-a-Module wird hier beschrieben. Wie teile ich globale Variablen modulübergreifend? Der Vollständigkeit halber werden die Inhalte hier geteilt:
quelle
config.x
kann ich es loswerden? Ich kam mitx = lambda: config.x
und dann habe ich den neuen Wert inx()
. Aus irgendeinem Grunda = config.x
macht es für mich nicht den Trick.from config import x
löst das?Python verwendet eine einfache Heuristik, um zu entscheiden, aus welchem Bereich eine Variable zwischen lokal und global geladen werden soll. Wenn ein Variablenname auf der linken Seite einer Zuweisung angezeigt wird, aber nicht als global deklariert ist, wird davon ausgegangen, dass er lokal ist. Wenn es nicht auf der linken Seite einer Zuweisung angezeigt wird, wird davon ausgegangen, dass es global ist.
Sehen Sie, wie baz, das auf der linken Seite einer Zuweisung in angezeigt
foo()
wird, die einzigeLOAD_FAST
Variable ist.quelle
for
Schleife und der Name nachas
inwith
undexcept
Anweisungen sind gebunden.as
in einerexcept
Klausel war mir das nicht klar. Es wird jedoch automatisch gelöscht, um Speicherplatz zu sparen.as ...
Ziels im Ausnahmehandler.Wenn Sie in einer Funktion auf eine globale Variable verweisen möchten, können Sie mit dem Schlüsselwort global deklarieren, welche Variablen global sind. Sie müssen es nicht in allen Fällen verwenden (wie hier fälschlicherweise behauptet wird). Wenn der Name, auf den in einem Ausdruck verwiesen wird, in den Funktionen, in denen diese Funktion definiert ist, nicht im lokalen Bereich oder Bereich gefunden werden kann, wird er unter global nachgeschlagen Variablen.
Wenn Sie jedoch einer neuen Variablen zuweisen, die in der Funktion nicht als global deklariert ist, wird sie implizit als lokal deklariert und kann jede vorhandene globale Variable mit demselben Namen überschatten.
Außerdem sind globale Variablen nützlich, im Gegensatz zu einigen OOP-Eiferern, die etwas anderes behaupten - insbesondere für kleinere Skripte, bei denen OOP übertrieben ist.
quelle
Wir können eine globale mit der folgenden Funktion erstellen:
Beim Schreiben einer Funktion wird der Code nicht ausgeführt. Also nennen wir die
create_global_variable
Funktion:Globale ohne Änderung verwenden
Sie können es einfach verwenden, solange Sie nicht erwarten, das Objekt zu ändern, auf das es zeigt:
Zum Beispiel,
und jetzt können wir die globale Variable verwenden:
Änderung der globalen Variablen innerhalb einer Funktion
Um die globale Variable auf ein anderes Objekt zu verweisen, müssen Sie das globale Schlüsselwort erneut verwenden:
Beachten Sie, dass nach dem Schreiben dieser Funktion der tatsächlich geänderte Code immer noch nicht ausgeführt wurde:
Also nach dem Aufruf der Funktion:
Wir können sehen, dass die globale Variable geändert wurde. Der
global_variable
Name zeigt jetzt auf'Bar'
:Beachten Sie, dass "global" in Python nicht wirklich global ist - es ist nur global auf Modulebene. Es steht also nur Funktionen zur Verfügung, die in den Modulen geschrieben sind, in denen es global ist. Funktionen merken sich das Modul, in das sie geschrieben wurden. Wenn sie also in andere Module exportiert werden, suchen sie immer noch in dem Modul, in dem sie erstellt wurden, um globale Variablen zu finden.
Lokale Variablen mit demselben Namen
Wenn Sie eine lokale Variable mit demselben Namen erstellen, wird eine globale Variable überschattet:
Die Verwendung dieser falsch benannten lokalen Variablen ändert jedoch nichts an der globalen Variablen:
Beachten Sie, dass Sie die Verwendung lokaler Variablen mit denselben Namen wie Globals vermeiden sollten, es sei denn, Sie wissen genau, was Sie tun, und haben einen sehr guten Grund dafür. Auf einen solchen Grund bin ich noch nicht gestoßen.
Wir bekommen das gleiche Verhalten im Unterricht
Ein folgender Kommentar fragt:
Hier zeige ich, dass wir bei Methoden dasselbe Verhalten haben wie bei regulären Funktionen:
Und nun:
Ich würde jedoch vorschlagen, anstelle globaler Variablen Klassenattribute zu verwenden, um eine Überlastung des Modul-Namespace zu vermeiden. Beachten Sie auch, dass wir hier keine
self
Argumente verwenden - dies können Klassenmethoden (praktisch, wenn das Klassenattribut vom üblichencls
Argument mutiert wird ) oder statische Methoden (noself
odercls
) sein.quelle
Zusätzlich zu bereits vorhandenen Antworten und um dies verwirrender zu machen:
Quelle: Welche Regeln gelten für lokale und globale Variablen in Python? .
quelle
Bei paralleler Ausführung können globale Variablen zu unerwarteten Ergebnissen führen, wenn Sie nicht verstehen, was passiert. Hier ist ein Beispiel für die Verwendung einer globalen Variablen innerhalb der Mehrfachverarbeitung. Wir können deutlich sehen, dass jeder Prozess mit einer eigenen Kopie der Variablen arbeitet:
Ausgabe:
quelle
Was Sie sagen, ist, die Methode wie folgt anzuwenden:
Der bessere Weg ist jedoch, die globale Variable wie folgt zu verwenden:
Beide geben die gleiche Ausgabe.
quelle
Wie sich herausstellt, ist die Antwort immer einfach.
Hier ist ein kleines Beispielmodul mit einer einfachen Möglichkeit, es in einer
main
Definition darzustellen :So zeigen Sie es in einer
main
Definition:Dieser einfache Code funktioniert einfach so und wird ausgeführt. Ich hoffe, es hilft.
quelle
global_vars
und initialisiere die Dateninit_global_vars
, die im Startskript aufgerufen werden. Dann erstelle ich einfach eine Accessormethode für jede definierte globale Variable. Ich hoffe, ich kann dies mehrmals verbessern! Danke Peter!Sie müssen in jeder Funktion, die Sie verwenden möchten, auf die globale Variable verweisen.
Wie folgt:
quelle
Sie speichern das Globale nicht in einer lokalen Variablen, sondern erstellen lediglich einen lokalen Verweis auf dasselbe Objekt, auf das sich Ihr ursprünglicher globaler Verweis bezieht. Denken Sie daran, dass so ziemlich alles in Python ein Name ist, der sich auf ein Objekt bezieht, und im normalen Betrieb nichts kopiert wird.
Wenn Sie nicht explizit angeben müssen, wann ein Bezeichner auf ein vordefiniertes globales Element verweisen soll, müssen Sie vermutlich explizit angeben, wann ein Bezeichner stattdessen eine neue lokale Variable ist (z. B. mit dem Befehl 'var') in JavaScript gesehen). Da lokale Variablen in jedem ernsthaften und nicht trivialen System häufiger vorkommen als globale Variablen, ist das Python-System in den meisten Fällen sinnvoller.
Sie könnten eine Sprache haben, die versucht hat zu raten, indem sie eine globale Variable verwendet, falls vorhanden, oder eine lokale Variable erstellt, wenn dies nicht der Fall ist. Dies wäre jedoch sehr fehleranfällig. Wenn Sie beispielsweise ein anderes Modul importieren, wird möglicherweise versehentlich eine globale Variable mit diesem Namen eingeführt, wodurch sich das Verhalten Ihres Programms ändert.
quelle
Versuche dies:
quelle
Wenn Sie eine lokale Variable mit demselben Namen haben, möchten Sie möglicherweise die
globals()
Funktion verwenden .quelle
Verwenden Sie im Anschluss und als Add-On eine Datei, um alle global deklarierten globalen Variablen zu enthalten, und dann
import as
:Datei initval.py :
Datei getstocks.py :
quelle
import ... as ...
? Warum nicht einfachimport ...
?global
:-) => +1 :-) Bitte bearbeiten Sie Ihre Antwort, um diese Fragen zu klären, die möglicherweise auch andere Personen haben. ProstDas Schreiben in explizite Elemente eines globalen Arrays erfordert anscheinend nicht die globale Deklaration, obwohl das Schreiben in "Wholesale" diese Anforderung erfordert:
quelle
Ich füge dies hinzu, da ich es in keiner der anderen Antworten gesehen habe und es für jemanden nützlich sein könnte, der mit etwas Ähnlichem zu kämpfen hat. Die
globals()
Funktion gibt ein veränderbares globales Symbolwörterbuch zurück, in dem Sie "magisch" Daten für den Rest Ihres Codes verfügbar machen können. Zum Beispiel:und
Sie können nur Variablen aus und in den globalen Namespace ausgeben. Super praktisch, kein Muss, keine Aufregung. Ich bin mir ziemlich sicher, dass es nur Python 3 ist.
quelle
globals()
Gibt immer Globals zurück, die im lokalen Kontext verfügbar sind, sodass eine Mutation hier möglicherweise nicht in einem anderen Modul angezeigt wird.Verweisen Sie auf den Klassennamensraum, in dem die Änderung angezeigt werden soll.
In diesem Beispiel verwendet Runner Max aus der Dateikonfiguration. Ich möchte, dass mein Test den Wert von max ändert, wenn der Läufer ihn verwendet.
main / config.py
main / running.py
tests / running_test.py
quelle
Globals sind in Ordnung - außer bei Multiprocessing
Globale Funktionen im Zusammenhang mit Multiprocessing auf verschiedenen Plattformen / Umgebungen wie Windows / Mac OS einerseits und Linux andererseits sind problematisch.
Ich werde Ihnen dies anhand eines einfachen Beispiels zeigen, das auf ein Problem hinweist, auf das ich vor einiger Zeit gestoßen bin.
Wenn Sie verstehen möchten, warum die Dinge unter Windows / MacOs und Linux anders sind, müssen Sie wissen, dass der Standardmechanismus zum Starten eines neuen Prozesses auf ...
Sie unterscheiden sich in der Speicherzuordnung und Initialisierung ... (aber darauf gehe ich hier nicht ein).
Schauen wir uns das Problem / Beispiel an ...
Windows
Wenn Sie dies unter Windows ausführen (und ich nehme an, auch unter MacOS), erhalten Sie die folgende Ausgabe ...
Linux
Wenn Sie dies unter Linux ausführen, erhalten Sie stattdessen Folgendes.
quelle