Jak mogę utworzyć lub użyć zmiennej globalnej w funkcji?
Jeśli utworzę zmienną globalną w jednej funkcji, jak mogę użyć tej zmiennej globalnej w innej funkcji? Czy muszę przechowywać zmienną globalną w zmiennej lokalnej funkcji, która potrzebuje do niej dostępu?
Możesz używać zmiennej globalnej w innych funkcjach, deklarując ją jako global
w każdej funkcji, która ją przypisuje:
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
Wyobrażam sobie, że powodem tego jest to, że ponieważ zmienne globalne są tak niebezpieczne, Python chce się upewnić, że naprawdę wiesz, że to jest to, z czym się bawisz, poprzez wyraźne wymaganie słowa kluczowego global
.
Zobacz inne odpowiedzi, jeśli chcesz udostępnić zmienną globalną w różnych modułach.
Możesz chcieć poznać pojęcie przestrzeni nazw. W Pythonie, moduł jest naturalnym miejscem dla globalnych danych:
Każdy moduł ma swoją własną prywatną tablicę symboli, która jest używana jako globalna tablica symboli przez wszystkie funkcje zdefiniowane w module. W ten sposób autor modułu może używać zmiennych globalnych w module bez obawy o przypadkowe zderzenie ze zmiennymi globalnymi użytkownika. Z drugiej strony, jeśli wiesz, co robisz, możesz dotknąć zmiennych globalnych modułu za pomocą tej samej notacji używanej do odwoływania się do jego funkcji,
modname.itemname
.
Specyficzne użycie global-in-a-module jest opisane tutaj - Jak współdzielić zmienne globalne pomiędzy modułami?, i dla kompletności, zawartość jest udostępniona tutaj:
Kanonicznym sposobem na współdzielenie informacji pomiędzy modułami w ramach jednego programu jest stworzenie specjalnego modułu konfiguracyjnego (często nazywanego config lub cfg). Wystarczy zaimportować moduł konfiguracyjny we wszystkich modułach swojej aplikacji; moduł staje się wtedy dostępny jako nazwa globalna. Ponieważ istnieje tylko jedna instancja każdego modułu, wszelkie zmiany dokonane w obiekcie modułu są odzwierciedlane wszędzie. Na przykład:
Plik: config.py
x = 0 # Domyślna wartość ustawienia konfiguracyjnego 'x'.
Plik: mod.py
import config config.x = 1
Plik: main.py
importować config import mod print config.x
Jeśli chcesz się odwołać do zmiennej globalnej w funkcji, możesz użyć słowa kluczowego global, aby zadeklarować, które zmienne są globalne. Nie musisz go używać we wszystkich przypadkach (jak ktoś tutaj błędnie twierdzi) - jeśli nazwa, do której odwołuje się wyrażenie, nie może być znaleziona w zakresie lokalnym lub zakresach funkcji, w których ta funkcja jest zdefiniowana, jest ona szukana wśród zmiennych globalnych.
Jeśli jednak przypiszesz do nowej zmiennej, która nie jest zadeklarowana jako globalna w funkcji, jest ona domyślnie zadeklarowana jako lokalna i może przesłonić każdą istniejącą zmienną globalną o tej samej nazwie.
Poza tym, zmienne globalne są użyteczne, w przeciwieństwie do niektórych gorliwców OOP, którzy twierdzą inaczej - szczególnie dla mniejszych skryptów, gdzie OOP jest overkill.