Python Academy · Les

nonlocal en veranderlijke status

Wijzig de omsluitende scope

Les 3 van 413 stappen

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; nonlocal voorkomt dat;
  • nonlocal richt zich op het bereik van de omsluitende functie; global richt zich op de module;
  • een veranderlijk object ter plekke wijzigen vereist geen declaratie;
  • closures met nonlocal maken 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())
Gratis beginnen

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

  1. Functies als first-class objects
  2. Closures en vrije variabelen
  3. nonlocal en veranderlijke status
  4. Partiële functies
← Terug naar Python Academy