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()
course_name"Python"lessonFUNKCJA OBIEKTOWA
Globalna przestrzeń nazw
topic„Funkcje”
Lokalna przestrzeń nazw lesson() podczas wywołania
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 name istnieje tylko w obrębie demo() i nie wpływa na globalną
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:

L — Local?Trueznaleźli → używamyFalseE — Enclosing?Trueznaleźli → używamyFalseG — Global?Trueznaleźli → używamyFalseB — Builtins?Trueznaleźli → używamyFalseNameError
Local → Enclosing → Global → Builtins - Poszukiwania zatrzymują się przy pierwszym dopasowaniu
LiteraCo to jestPrzykład
L — Localnazwy wewnątrz bieżącej funkcjitopic w środku lesson()
E — Enclosingnazwy funkcji zewnętrznej dla funkcji zagnieżdżonej (§13.13)spójrzmy dalej
G — Globalnazwy na poziomie modułucourse_name
B — Builtinswbudowane nazwy Pythonlen, 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
Otwórz praktykę →