Rozdział 13 · Automatyzacja z funkcjami
Zmienne globalne i lokalne
Gdzie „mieszka” zmienna i w jakiej kolejności Python jej szuka — model LEGB uwolni wielu dziwnych błędów.
Zmienne wewnątrz funkcji
Zmienna utworzona wewnątrz funkcji nazywana jest lokalny — ona istnieje tylko wtedy, gdy funkcja jest uruchomiona i nie jest dostępna z zewnątrz:
lokalnye_peremennye.py
def moya_funkciya():
message = „Mieszkam tylko wewnątrz funkcji”
print(message)
moya_funkciya()
print(message) #NameError: message tutaj nie jest zdefiniowane
Zmienne globalne
Global zmienna jest deklarowany poza wszystkimi cechami — i jest czytelny W każdym z nich:
globalnye_peremennye.py
course_name = "Python"
def lesson():
topic = „Funkcje”
print(course_name) # Czytanie globalnie – Praca bez żadnych zastrzeżeń
print(topic)
lesson()
Funkcja może patrzeć na zewnątrz, ale nie odwrotnie
Funkcja może ODCZYTYWAĆ nazwy globalne, ale zmienne utworzone w niej nie są automatycznie widoczne z zewnątrz.
Cieniowanie (shadowing)
shadowing.py
name = "GLOBAL"
def demo():
name = "LOCAL"
print(name)
demo()
print(name)
LOCAL
GLOBAL
Lokalna nazwa przychodzi do globalnej nazwy o tej samej nazwie
Wewnątrz
demo() TWOIM tworzymy osobną lokalną nazwę name tymczasowo „przyćmiewa” name kod wewnątrz funkcji, ale nie zastępuje ani nie usuwa go.LEGB: Python jak szuka imienia
Gdy Python napotyka nazwę, szuka jej w jasnej kolejności — ten model nazywa się LEGB:
| Litera | Co to jest | Przykład |
|---|---|---|
| L — Local | nazwy wewnątrz bieżącej funkcji | topic w środku lesson() |
| E — Enclosing | nazwy funkcji zewnętrznej dla funkcji zagnieżdżonej (§13.13) | spójrzmy dalej |
| G — Global | nazwy na poziomie modułu | course_name |
| B — Builtins | wbudowane nazwy Python | len, print |
UnboundLocalError — dlaczego to NIE jest przypadek
unbound_local.py
count = 10
def increment():
count += 1
increment()
Przypisanie w dowolnym miejscu ciała sprawia, że nazwa jest lokalna W CAŁYM tkanku funkcji
Python widzi
count += 1 (to count = count + 1) i z góry decyduje: count jest przypisana wewnątrz funkcji, więc jest to nazwa LOKALNA — w całym ciele funkcji, nie tylko po przypisaniu. Ale po prawej stronie count + 1 próbuje CZYTAĆ count ZANIM pojawiło się lokalne znaczenie — stąd stąd UnboundLocalError. To nie jest zachowanie losowe, lecz bezpośrednia konsekwencja sposobu, w jaki Python wstępnie oznacza nazwy funkcji lokalnych.global — jeśli naprawdę trzeba zmienić zmienną globalną
global_keyword.py
count = 10
def increment():
global count
count += 1
increment()
print(count) # 11
global jest potrzebne tylko do zadania, nie do czytania
Możesz po prostu ODCZYTAĆ zmienną globalną bez
global (robiliśmy to już z course_name powyżej). global jest potrzebne tylko wtedy, gdy funkcja ma zamiar ZMIENIĆ (przydzielić) nazwę globalną.global działa, ale częściej istnieje lepszy sposób
global nie jest zakazaną, ale często nie najlepszą praktyką: funkcje odczytujące parametry i zwracające wynik przez returnłatwiej testować i ponownie używać, ponieważ ich zachowanie nie zależy od ukrytego stanu zewnętrznego. To nie jest absolutna zasada „zmienne globalne są zawsze złe”Praktyka: zmienne lokalne, globalne i LEGB
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji