Rozdział 13 · Automatyzacja z funkcjami

Zagnieżdżone funkcje i nonlocal

Funkcję można zdefiniować bezpośrednio wewnątrz innej funkcji — i nonlocal pozwala jej zmieniać nazwę funkcji obejmującej, a nie tylko ją odczytywać.

Funkcja w obrębie funkcji

Funkcję można zdefiniować bezpośrednio wewnątrz ciała innej funkcji:

vlozhennaya_funkciya.py
def outer():
    message = "Hello"

    def inner():
        print(message)

    inner()

outer()
inner widzi message jest Enclosing LEGB
inner() nie ma własnego message, ale znajduje go w funkcji obejmującej outer() — to litera „E” (Enclosing) z drabinki LEGB (§13.12).
Wgłębienie nie jest ozdobą, lecz deklaracją gniazdowania
Gdy przypadkowo przesuniesz def inner(): poziom wcięcia jest mniejszy niż konieczne, nie będzie już zagnieżdżony w outer — i odwrotnie. Wcięcie dosłownie określa, która funkcja jest „wewnątrz”

nonlocal

Podobnie jak w przypadku zmiennych globalnych, można swobodnie odczytać nazwę z funkcji obejmującej, oraz oto ZMIANA (przypisuj) – musisz wyraźnie zapytać:

nonlocal.py
def outer():
    count = 0

    def inner():
        nonlocal count
        count += 1

    inner()
    inner()
    print(count)

outer()
2
nonlocal pozwalało inner() modyfikować count z outer() zamiast tworzyć lokalną kopię
nonlocal — to NIE global
nonlocal szuka nazwy w NAJBLIŻSZEJ odpowiedniej funkcji obejmującej — nie na poziomie modułu. Jeśli usunąć nonlocal countotrzymasz ten sam błąd UnboundLocalErrorjak w §13.12 — z tego samego powodu: przypisanie w ramach inner by się dobrze count lokalnej nazwy inner.

Trochę głębiej — zamknięcie (closure)

Funkcja zagnieżdżona potrafi „zapamiętać” wartości z funkcji otaczającej nawet po tym, jak wywołanie zewnętrzne już się zakończyło:

closure.py
def make_greeter(name):
    def greet():
        print(f"Cześć, {name}!")
    return greet

greet_anna = make_greeter("Anna")
greet_anna()   #Hey Anna! — chociaż make_greeter już skończył pracę
Zamknięcie to temat na przyszłość
Tak się nazywa zamknięciegreet dostęp „zabiera ze sobą” name. Wystarczy tu zauważyć, że w ogóle tak się dzieje — szczegółowa analiza zamknięć i ich praktycznych zastosowań (dekoratorów i nie tylko) nie została uwzględniona w tym rozdziale.
Praktyka: funkcje zagnieżdżone i nonlocal
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →