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ą;
nonlocaltemu zapobiega. nonlocalodnosi się do zakresu otaczającej funkcji, aglobal— do modułu.- Modyfikowanie obiektu zmiennego bezpośrednio nie wymaga deklaracji.
- Domknięcia z użyciem
nonlocalumoż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
- Funkcje pierwszej klasy
- Domknięcia i zmienne wolne
- nonlocal i stan zmienny
- Funkcje częściowe