Ich bin etwas verwirrt darüber, wie die globalen Variablen funktionieren. Ich habe ein großes Projekt mit ungefähr 50 Dateien und muss globale Variablen für alle diese Dateien definieren.
Ich habe sie in meiner Projektdatei main.py
wie folgt definiert:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
Ich versuche zu verwenden , myList
in subfile.py
, wie folgend
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
Ein anderer Weg, den ich versucht habe, aber auch nicht funktioniert hat
# ../myproject/main.py
# Import globfile
import globfile
# Save myList into globfile
globfile.myList = []
# Import subfile
import subfile
# Do something
subfile.stuff()
print(globfile.myList[0])
Und drinnen hatte subfile.py
ich folgendes:
# ../myproject/subfile.py
# Import globfile
import globfile
# Save "hey" into myList
def stuff():
globfile.myList.append("hey")
Aber es hat wieder nicht funktioniert. Wie soll ich das umsetzen? Ich verstehe, dass es so nicht funktionieren kann, wenn sich die beiden Dateien nicht wirklich kennen (nun, Subdatei kennt Main nicht), aber ich kann mir nicht vorstellen, wie es geht, ohne Io Writing oder Pickle zu verwenden Ich will nicht tun
NameError: name 'myList' is not defined
frommain.py
lineprint(globfile.myList[0])
Antworten:
Das Problem ist , dass Sie definiert
myList
ausmain.py
, abersubfile.py
es braucht zu verwenden. Hier ist ein sauberer Weg, um dieses Problem zu lösen: Verschieben Sie alle Globals in eine Datei, ich nenne diese Dateisettings.py
. Diese Datei ist dafür verantwortlich, Globals zu definieren und zu initialisieren:Als nächstes können Sie
subfile
Globals importieren:Beachten Sie, dass
subfile
nicht aufgerufen wirdinit()
- diese Aufgabe gehört zumain.py
:Auf diese Weise erreichen Sie Ihr Ziel und vermeiden es, globale Variablen mehrmals zu initialisieren.
quelle
init()
Zeug. Module werden nur beim ersten Import ausgewertet. Daher ist es vollkommen in Ordnung, diese Variablen im Hauptteil des Moduls zu initialisieren.Siehe Pythons Dokument zum Teilen globaler Variablen zwischen Modulen :
quelle
x
mitfrom config import x
, sondern nur mitimport config
Sie können sich globale Python-Variablen als "Modul" -Variablen vorstellen - und als solche sind sie viel nützlicher als die traditionellen "globalen Variablen" von C.
Eine globale Variable ist tatsächlich in einem Modul definiert
__dict__
und kann von außerhalb dieses Moduls als Modulattribut aufgerufen werden.Also, in Ihrem Beispiel:
Und:
quelle
Die Verwendung
from your_file import *
sollte Ihre Probleme beheben. Es definiert alles so, dass es global verfügbar ist (mit Ausnahme der lokalen Variablen bei den Importen natürlich).beispielsweise:
und:
quelle
import *
um jeden Preis, so dass Referenzen explizit (und nicht verwirrend) sind. Außerdem, wann haben Sie jemals tatsächlich alle "*
" Referenzen in einem Modul verwendet?Hai Vu Antwort funktioniert super, nur ein Kommentar:
Wenn Sie das Global in einem anderen Modul verwenden und das Global dynamisch festlegen möchten, achten Sie darauf, die anderen Module zu importieren, nachdem Sie die globalen Variablen festgelegt haben. Beispiel:
quelle
Ihr zweiter Versuch wird perfekt funktionieren und ist eine wirklich gute Möglichkeit, mit Variablennamen umzugehen, die global verfügbar sein sollen. In der letzten Zeile ist jedoch ein Namensfehler aufgetreten. So sollte es sein:
Sehen Sie die letzte Zeile? myList ist ein Attribut von globfile, nicht von subfile. Dies wird funktionieren, wie Sie wollen.
Mike
quelle