Używanie zmiennych globalnych w funkcji

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?

Rozwiązanie

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.

Komentarze (13)

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

Komentarze (2)

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.

Komentarze (1)