Python: Austausch von globalen Variablen zwischen Modulen und Klassen darin
Ich weiß, dass es möglich ist zu teilen eine Globale variable in allen Modulen in Python. Allerdings würde ich gerne wissen, inwieweit dies möglich ist und warum. Zum Beispiel,
global_mod.py
x = None
mid_access_mod.py
from global_mod import *
class delta:
def __init__(self):
print x
bot_modif_mod.py
import mid_access_mod
import global_mod
class mew:
def __init__(self):
global_mod.x = 5
def main():
m = mew()
d = mid_access_mod.delta()
Dieser druckt Keiner, obwohl alle Module teilen die Globale variable x ist. Warum ist das der Fall? Wie es scheint, x bewertet mid_access_mod.py vor der Zuweisung in bot_modif_mod.py von mew().
InformationsquelleAutor emish | 2010-07-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies geschieht, weil Sie über unveränderliche Werte (Ganzzahlen und Keine), und Import-Variablen wie an Dinge von Wert, die nicht durch die Dinge, die durch Verweis.
Wenn Sie global_mod.x eine Liste ist, und manipuliert dessen erstes element, es würde so funktionieren, wie Sie erwarten.
Wenn Sie
from global_mod import x
erstellen Sie einen Namenx
im Modul mit dem gleichen Wert wiex
hat inglobal_mod
. Für Dinge wie Funktionen und Klassen, diese funktioniert wie man es erwarten würde, weil die Menschen (im Allgemeinen) nicht neu zuweisen, um diese Namen später.Als Alex weist darauf hin, wenn Sie
import global_mod
, und dannglobal_mod.x
, werden Sie das problem vermeiden. Der name, den Sie definieren in Ihrem Modul werdenglobal_mod
, die bezieht sich immer auf das Modul, das Sie möchten, und dann mit Attribut-Zugriff zu erhaltenx
erhalten Sie die neuesten Wertx
.from modulename import *
stattimport modulename
. Wenn Sie emish-code und ändern global_mod.py zux = ['starting list']
und ändern Sie dann die Umwidmung in bot_modif_mod.py zuglobal_mod.x = ['new list']
Sie werden feststellen, dass diese Drucke "['Startliste']". Das eigentliche Problem, wie Alex Martinelli Staaten ist, dassfrom modulename import *
snapshots. Ich hoffe, dass andere Benutzer nicht ähnlich verwirrt war wie ich.Ich glaube, dass das, was @Ned binden zu sagen ist, dass, gegeben, dass
x= ['starting list']
sollte man den Wert verändern, indem dabeix[0] = 'new value'
eher als Zuweisung des Wertes an eine komplett neue Liste (x = ['new list']
)InformationsquelleAutor Ned Batchelder
from whatever import *
ist nicht eine gute idiom zu verwenden, in Ihrem code -- es ist für die Verwendung vorgesehen, wenn überhaupt, in einer interaktiven session, wie eine Verknüpfung, um sich Tipparbeit ersparen. Es ist im Grunde "snapshots" alle Namen aus dem Modul an diesem Punkt in der Zeit-wenn Sie jemals rebind jedem dieser Namen, die snapshot gewachsen abgestanden und alle Art von Problemen entstehen wird. Und das ist nur der Anfang von dem unentwirrbaren Durcheinander der Anmeldung bis für mit den Elendenfrom ... import *
konstruieren.Wollen meinen Rat? Vergessen Sie jemals gehört, über das Konstrukt vorhandenen und nie, nie wieder verwenden. Verwenden
import global_mod as m
und verwende immer danach qualifizierte Namen wiem.x
-- qualifizierte Namen sind so viel handlicher und kraftvoller in Python, als bloße barenames, dass es ist nicht sogar lustig. (Dieas m
Teil derimport
Aussage ist völlig optional und im Grunde existiert für Prägnanz Zwecke, oder manchmal, um zu arbeiten, um einige Probleme, die mit Namen Auseinandersetzungen; verwenden Sie es, Wann und wenn Sie einen finden es praktisch, da es hat keine Nachteile, aber nicht das Gefühl, gezwungen oder auch aufgefordert, zu verwenden, wenn Sie nicht das Gefühl, es ist notwendig).InformationsquelleAutor Alex Martelli
Modifizierte ich die Beispiel für die Verwendung einer Liste für die x-und die Liste weist (x[0] = ..) als Vorschlag in die top-Antwort, und der Druck wird zurückgegeben, die den gleichen Anfangswert (Keine)..Dadurch wird sichergestellt, dass die "von global_mod import *" ist eine Kopie, unabhängig von veränderlichen oder nicht.
Wie bereits in der Bemerkung "import global_mod" funktioniert, wenn "drucken global_mod.x = ist dann in mid_access_mod.
InformationsquelleAutor knormoyle
Als Ned Batchelder erwähnt, nur die Werte, die geteilt werden und nicht das eigentliche Objekt. Wenn Sie freigeben möchten ein Objekt über eine Referenz, dann sind Sie wahrscheinlich auf der Suche
Thread-Local Data
.ZB:
Nun, Wann immer Sie wollen zugreifen oder Sie ändern die variable g ist.Bevölkerung, erhalten Sie einen aktualisierten Wert, vorausgesetzt es ist der gleiche Faden, den Sie versuchen, zu zugreifen.
Lesen Sie mehr in der Python-Dokumentation:https://docs.python.org/3/library/threading.html#thread-local-data
InformationsquelleAutor Kevin
Um dieses problem zu lösen, ändern Sie einfach
from global_mod import *
zuimport global_mod
.Und die neue mid_access_mod.py werden:
Den Grund dafür gefunden werden konnte hier.
InformationsquelleAutor Chaoz