nonlocal en veranderlijke status
Wijzig de omsluitende scope
nonlocal en veranderlijke status is een gratis Python Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Python Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Python Academy bevat in totaal 4 lessen.
Omsluitende variabelen lezen en schrijven
Een binnenfunctie kan een omsluitende variabele vrijelijk lezen, maar als de functie aan die naam probeert toe te wijzen, behandelt Python de naam als een nieuwe lokale variabele. Dit verrast beginners vaak.
def outer():
count = 0
def inner():
return count
return inner()
print(outer())De toewijzingsvalkuil
Toewijzen aan een omsluitende naam zonder dat expliciet aan te geven maakt de naam lokaal, waardoor de buitenste variabele nooit wordt bijgewerkt. Hier gaat de wijziging verloren.
def outer():
count = 0
def bump():
count = count + 1
try:
bump()
except UnboundLocalError as e:
print('Error:', e)
outer()Het sleutelwoord nonlocal
nonlocal geeft aan dat een naam verwijst naar een variabele in het bereik van de dichtstbijzijnde omsluitende functie. Toewijzingen werken daardoor die buitenste variabele bij in plaats van een lokale variabele te maken.
def outer():
count = 0
def bump():
nonlocal count
count += 1
bump()
bump()
return count
print(outer())Een tellerclosure
Met nonlocal kun je een teller met toestand bouwen. Elke aanroep wijzigt de vastgelegde variabele en onthoudt de voortgang.
def make_counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
c = make_counter()
print(c())
print(c())
print(c())Onafhankelijke tellers
Elke teller behoudt zijn eigen toestand, omdat elke closure een afzonderlijke variabele vastlegt.
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 versus global
nonlocal richt zich op een omsluitend functie-bereik, terwijl global zich op het moduleniveau richt. Gebruik nonlocal voor closures en global voor toestand die de hele module omvat.
total = 0
def add_global(n):
global total
total += n
add_global(5)
add_global(3)
print(total)Veranderlijke toestand zonder nonlocal
Als de omsluitende waarde een veranderlijk object is, zoals een lijst of woordenboek, kun je dat ter plekke wijzigen zonder nonlocal, omdat je de naam niet opnieuw aan een ander object koppelt.
def make_logger():
history = []
def log(msg):
history.append(msg)
return history
return log
log = make_logger()
log('start')
print(log('stop'))Een accumulator
Door nonlocal met een closure te combineren krijg je een doorlopende accumulator die elke waarde bij een onthouden totaal optelt.
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))Een eenvoudige schakelaar
Met nonlocal kun je eenvoudig een booleaanse toestand tussen aanroepen omkeren.
def make_toggle():
on = False
def toggle():
nonlocal on
on = not on
return on
return toggle
t = make_toggle()
print(t(), t(), t())Toestand terugzetten
Je kunt meerdere binnenfuncties beschikbaar maken die dezelfde omsluitende toestand delen, bijvoorbeeld één om op te tellen en één om te resetten.
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 vereist een bestaande variabele
nonlocal vereist dat de naam al in een omsluitend bereik bestaat; anders veroorzaakt Python tijdens het definiëren een SyntaxError. Het sleutelwoord kan geen nieuwe buitenvariabele maken.
def outer():
value = 'set'
def inner():
nonlocal value
value = 'changed'
inner()
return value
print(outer())Korte controle
Binnen een geneste functie wil je een variabele uit de omsluitende functie opnieuw toewijzen. Welk sleutelwoord gebruik je?
Samenvatting: nonlocal en veranderlijke toestand
Samenvatting:
- toewijzen aan een omsluitende naam maakt normaal gesproken een nieuwe lokale variabele;
nonlocalvoorkomt dat; nonlocalricht zich op het bereik van de omsluitende functie;globalricht zich op de module;- een veranderlijk object ter plekke wijzigen vereist geen declaratie;
- closures met
nonlocalmaken tellers, accumulators en schakelaars die toestand onthouden.
def make_counter():
n = 0
def inc():
nonlocal n
n += 1
return n
return inc
c = make_counter()
print(c(), c())Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 76
- Lessen
- 320
Veelgestelde vragen
Is de les “nonlocal en veranderlijke status” gratis?
Ja — de volledige tekst van “nonlocal en veranderlijke status” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Python Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Python Academy bevat in totaal 4 lessen.
Wat leer ik in “nonlocal en veranderlijke status”?
Wijzig de omsluitende scope Je oefent met Python Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Python Academy te beginnen?
Ervaring vooraf is niet nodig. Python Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “nonlocal en veranderlijke status”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Python Academy?
Ja. Elke les over Python Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Functies als first-class objects
- Closures en vrije variabelen
- nonlocal en veranderlijke status
- Partiële functies