Jeśli utworzę zmienną globalną w jednej funkcji, jak mogę użyć tej zmiennej w innej funkcji?
Możemy stworzyć globalny za pomocą następującej funkcji:
def create_global_variable():
global global_variable # must declare it to be a global first
# modifications are thus reflected on the module's global scope
global_variable = 'Foo'
Napisanie funkcji tak naprawdę nie uruchamia jej kodu. Dlatego nazywamy create_global_variable
funkcję:
>>> create_global_variable()
Używanie globałów bez modyfikacji
Możesz po prostu z niego korzystać, o ile nie spodziewasz się zmienić obiektu, na który wskazuje:
Na przykład,
def use_global_variable():
return global_variable + '!!!'
a teraz możemy użyć zmiennej globalnej:
>>> use_global_variable()
'Foo!!!'
Modyfikacja zmiennej globalnej z wnętrza funkcji
Aby wskazać zmienną globalną na inny obiekt, musisz ponownie użyć słowa kluczowego global:
def change_global_variable():
global global_variable
global_variable = 'Bar'
Zauważ, że po napisaniu tej funkcji kod, który ją zmienia, wciąż nie działa:
>>> use_global_variable()
'Foo!!!'
Po wywołaniu funkcji:
>>> change_global_variable()
widzimy, że zmienna globalna została zmieniona. global_variable
Nazwa wskazuje teraz 'Bar'
:
>>> use_global_variable()
'Bar!!!'
Zauważ, że „globalny” w Pythonie nie jest tak naprawdę globalny - jest tylko globalny do poziomu modułu. Jest więc dostępny tylko dla funkcji zapisanych w modułach, w których jest globalny. Funkcje zapamiętują moduł, w którym zostały napisane, więc kiedy są eksportowane do innych modułów, nadal szukają modułu, w którym zostały utworzone, aby znaleźć zmienne globalne.
Zmienne lokalne o tej samej nazwie
Jeśli utworzysz zmienną lokalną o tej samej nazwie, przyćmi ona zmienną globalną:
def use_local_with_same_name_as_global():
# bad name for a local variable, though.
global_variable = 'Baz'
return global_variable + '!!!'
>>> use_local_with_same_name_as_global()
'Baz!!!'
Ale użycie tej źle nazwanej zmiennej lokalnej nie zmienia zmiennej globalnej:
>>> use_global_variable()
'Bar!!!'
Pamiętaj, że powinieneś unikać używania lokalnych zmiennych o takich samych nazwach jak globale, chyba że wiesz dokładnie, co robisz i masz bardzo dobry powód, aby to zrobić. Nie spotkałem jeszcze takiego powodu.
Takie samo zachowanie uzyskujemy na zajęciach
W komentarzu pojawia się pytanie:
co zrobić, jeśli chcę utworzyć zmienną globalną wewnątrz funkcji w klasie i chcę użyć tej zmiennej w innej funkcji w innej klasie?
Tutaj pokazuję, że uzyskujemy takie samo zachowanie w metodach, jak w przypadku zwykłych funkcji:
class Foo:
def foo(self):
global global_variable
global_variable = 'Foo'
class Bar:
def bar(self):
return global_variable + '!!!'
Foo().foo()
I teraz:
>>> Bar().bar()
'Foo!!!'
Proponuję jednak zamiast używać zmiennych globalnych używać atrybutów klas, aby uniknąć zaśmiecania przestrzeni nazw modułów. Zauważ też, że nie używamy self
tutaj argumentów - mogą to być metody klasowe (przydatne, gdy mutujemy atrybut klasy ze zwykłego cls
argumentu) lub metody statyczne (nie self
lub cls
).