Jestem trochę zdezorientowany, jak działają zmienne globalne. Mam duży projekt z około 50 plikami i muszę zdefiniować zmienne globalne dla wszystkich tych plików.
To, co zrobiłem, to zdefiniowanie ich w main.py
pliku moich projektów , jako:
# ../myproject/main.py
# Define global myList
global myList
myList = []
# Imports
import subfile
# Do something
subfile.stuff()
print(myList[0])
Próbuję użyć myList
w subfile.py
następujący sposób
# ../myproject/subfile.py
# Save "hey" into myList
def stuff():
globals()["myList"].append("hey")
Próbowałem w inny sposób, ale też nie działałem
# ../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])
A w środku subfile.py
miałem to:
# ../myproject/subfile.py
# Import globfile
import globfile
# Save "hey" into myList
def stuff():
globfile.myList.append("hey")
Ale znowu to nie zadziałało. Jak mam to zaimplementować? Rozumiem, że to nie może tak działać, gdy dwa pliki tak naprawdę się nie znają (dobrze, podtekst nie zna głównego), ale nie mogę wymyślić, jak to zrobić, bez użycia pisma io marynowaniu, które Nie chcę robić
NameError: name 'myList' is not defined
zmain.py
liniiprint(globfile.myList[0])
Odpowiedzi:
Problem polega na zdefiniowaniu
myList
zmain.py
, alesubfile.py
musi go używać. Oto czysty sposób na rozwiązanie tego problemu: przenieś wszystkie globale do pliku, nazywam ten pliksettings.py
. Ten plik jest odpowiedzialny za zdefiniowanie globalizacji i ich zainicjowanie:Następnie
subfile
możesz zaimportować globale:Zauważ, że
subfile
nie dzwoniinit()
- to zadanie należy domain.py
:W ten sposób osiągasz swój cel, unikając inicjalizacji zmiennych globalnych więcej niż jeden raz.
źródło
init()
. Moduły są oceniane tylko przy pierwszym imporcie, więc inicjowanie tych zmiennych w treści modułu jest całkowicie w porządku.Zobacz dokument Pythona na temat udostępniania zmiennych globalnych między modułami :
źródło
x
za pomocąfrom config import x
, tylko używającimport config
Możesz myśleć o zmiennych globalnych w Pythonie jako zmiennych „modułowych” - i jako takie są one znacznie bardziej przydatne niż tradycyjne „zmienne globalne” z C.
Zmienna globalna jest faktycznie zdefiniowana w module
__dict__
i może być dostępna z zewnątrz tego modułu jako atrybut modułu.W twoim przykładzie:
I:
źródło
Korzystanie
from your_file import *
powinno naprawić twoje problemy. Definiuje wszystko, aby było globalnie dostępne (z wyjątkiem zmiennych lokalnych podczas importu, oczywiście).na przykład:
i:
źródło
import *
za wszelką cenę, aby odniesienia były jawne (i nie mylące). Poza tym, kiedy kiedykolwiek używałeś wszystkich*
odniesień w jakimkolwiek module?Odpowiedź Hai Vu działa świetnie, tylko jeden komentarz:
Jeśli używasz globalnego w innym module i chcesz dynamicznie ustawiać globalny, zwróć uwagę na import innych modułów po ustawieniu globalnych zmiennych, na przykład:
źródło
Druga próba będzie działać idealnie i jest to naprawdę dobry sposób na obsługę nazw zmiennych, które chcesz mieć dostępne na całym świecie. Ale masz błąd nazwy w ostatnim wierszu. Oto jak powinno być:
Widzisz ostatnią linię? myList to atrybut pliku globalnego, a nie podtekstu. To zadziała tak, jak chcesz.
Mikrofon
źródło