0Pricing
Python Academy · Lekcja

nonlocal i stan zmienny

Modyfikuj zakres otaczający

nonlocal i stan zmienny to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Odczytywanie i zapisywanie zmiennych zewnętrznych

Funkcja wewnętrzna może swobodnie odczytywać zmienną zewnętrzną, ale jeśli spróbuje przypisać wartość do tej nazwy, Python potraktuje ją jako nową zmienną lokalną. Często zaskakuje to początkujących.

def outer():
    count = 0
    def inner():
        return count
    return inner()
print(outer())

Pułapka przypisania

Przypisanie wartości do nazwy zewnętrznej bez zadeklarowania zamiaru sprawia, że nazwa staje się lokalna, więc zmienna zewnętrzna nie zostaje zaktualizowana. W tym przykładzie zmiana zostaje utracona.

def outer():
    count = 0
    def bump():
        count = count + 1
    try:
        bump()
    except UnboundLocalError as e:
        print('Error:', e)
outer()

Słowo kluczowe nonlocal

nonlocal deklaruje, że nazwa odnosi się do zmiennej w najbliższym otaczającym zakresie funkcji, dzięki czemu przypisania aktualizują tę zmienną zewnętrzną zamiast tworzyć zmienną lokalną.

def outer():
    count = 0
    def bump():
        nonlocal count
        count += 1
    bump()
    bump()
    return count
print(outer())

Domknięcie licznika

Za pomocą nonlocal można utworzyć licznik zachowujący stan. Każde wywołanie modyfikuje przechwyconą zmienną i zapamiętuje postęp.

def make_counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment
c = make_counter()
print(c())
print(c())
print(c())

Niezależne liczniki

Każdy licznik przechowuje własny stan, ponieważ każde domknięcie przechwytuje osobną zmienną.

def make_counter():
    count = 0
    def inc():
        nonlocal count
        count += 1
        return count
    return inc
a = make_counter()
b = make_counter()
print(a(), a(), b())

nonlocal a global

nonlocal odnosi się do zakresu otaczającej funkcji, natomiast global — do poziomu modułu. Należy używać nonlocal w domknięciach, a global dla stanu współdzielonego w całym module.

total = 0
def add_global(n):
    global total
    total += n
add_global(5)
add_global(3)
print(total)

Zmienny stan bez nonlocal

Jeśli wartość zewnętrzna jest obiektem zmiennym, takim jak lista lub słownik, można modyfikować ją bezpośrednio bez nonlocal, ponieważ nazwa nie jest przypisywana ponownie.

def make_logger():
    history = []
    def log(msg):
        history.append(msg)
        return history
    return log
log = make_logger()
log('start')
print(log('stop'))

Akumulator

Połączenie nonlocal z domknięciem pozwala utworzyć akumulator, który dodaje każdą wartość do zapamiętanej sumy.

def make_accumulator():
    total = 0
    def add(n):
        nonlocal total
        total += n
        return total
    return add
acc = make_accumulator()
print(acc(10))
print(acc(5))
print(acc(100))

Prosty przełącznik

nonlocal ułatwia przełączanie stanu logicznego między wywołaniami.

def make_toggle():
    on = False
    def toggle():
        nonlocal on
        on = not on
        return on
    return toggle
t = make_toggle()
print(t(), t(), t())

Resetowanie stanu

Można udostępnić wiele funkcji wewnętrznych współdzielących ten sam stan zewnętrzny, na przykład jedną do dodawania i drugą do resetowania.

def make_bank():
    balance = 0
    def deposit(n):
        nonlocal balance
        balance += n
        return balance
    def reset():
        nonlocal balance
        balance = 0
        return balance
    return deposit, reset
deposit, reset = make_bank()
print(deposit(50))
print(reset())

nonlocal wymaga istniejącej zmiennej

nonlocal wymaga, aby nazwa już istniała w otaczającym zakresie; w przeciwnym razie Python zgłasza SyntaxError w chwili definicji. Nie można za jego pomocą utworzyć nowej zmiennej zewnętrznej.

def outer():
    value = 'set'
    def inner():
        nonlocal value
        value = 'changed'
    inner()
    return value
print(outer())

Szybki test

W funkcji zagnieżdżonej chcesz ponownie przypisać wartość zmiennej z funkcji zewnętrznej. Którego słowa kluczowego użyjesz?

Podsumowanie: nonlocal i zmienny stan

Podsumowanie:

  • Przypisanie wartości do nazwy zewnętrznej zwykle tworzy nową zmienną lokalną; nonlocal temu zapobiega.
  • nonlocal odnosi się do zakresu otaczającej funkcji, a global — do modułu.
  • Modyfikowanie obiektu zmiennego bezpośrednio nie wymaga deklaracji.
  • Domknięcia z użyciem nonlocal umożliwiają tworzenie liczników, akumulatorów i przełączników, które zapamiętują stan.
def make_counter():
    n = 0
    def inc():
        nonlocal n
        n += 1
        return n
    return inc
c = make_counter()
print(c(), c())

Często zadawane pytania

Czy lekcja „nonlocal i stan zmienny” jest bezpłatna?

Tak — pełny tekst „nonlocal i stan zmienny” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „nonlocal i stan zmienny”?

Modyfikuj zakres otaczający Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „nonlocal i stan zmienny”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?

Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Funkcje pierwszej klasy
  2. Domknięcia i zmienne wolne
  3. nonlocal i stan zmienny
  4. Funkcje częściowe
← Powrót do Python Academy