nonlocal og foranderlig tilstand
Redigér det omsluttende scope
nonlocal og foranderlig tilstand er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.
Læsning og skrivning af variabler i det omsluttende område
En indre funktion kan frit læse en variabel fra det omsluttende område, men hvis den forsøger at tildele noget til det navn, behandler Python det som en ny lokal variabel. Det overrasker ofte begyndere.
def outer():
count = 0
def inner():
return count
return inner()
print(outer())Tildelingsfælden
Hvis du tildeler en værdi til et navn fra det omsluttende område uden at angive hensigten, bliver navnet lokalt, så den ydre variabel aldrig opdateres. Her går ændringen tabt.
def outer():
count = 0
def bump():
count = count + 1
try:
bump()
except UnboundLocalError as e:
print('Error:', e)
outer()Nøgleordet nonlocal
nonlocal angiver, at et navn henviser til en variabel i det nærmeste omsluttende funktionsområde, så tildelinger opdaterer den ydre variabel i stedet for at oprette en lokal.
def outer():
count = 0
def bump():
nonlocal count
count += 1
bump()
bump()
return count
print(outer())En tællerlukning
Med nonlocal kan du oprette en tæller, der bevarer sin tilstand. Hvert kald ændrer den indfangede variabel og husker, hvor langt den er nået.
def make_counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
c = make_counter()
print(c())
print(c())
print(c())Uafhængige tællere
Hver tæller bevarer sin egen tilstand, fordi hver lukning indfanger en separat variabel.
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 kontra global
nonlocal rammer et omsluttende funktionsområde, mens global rammer modulniveauet. Brug nonlocal til lukninger og global til tilstand, der deles af hele modulet.
total = 0
def add_global(n):
global total
total += n
add_global(5)
add_global(3)
print(total)Ændringsbar tilstand uden nonlocal
Hvis værdien i det omsluttende område er et objekt, der kan ændres, som en liste eller ordbog, kan du ændre det direkte uden nonlocal, fordi du ikke tildeler navnet en ny værdi.
def make_logger():
history = []
def log(msg):
history.append(msg)
return history
return log
log = make_logger()
log('start')
print(log('stop'))En akkumulator
Ved at kombinere nonlocal med en lukning får du en løbende akkumulator, der føjer hver værdi til en husket total.
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))Et simpelt skift
nonlocal gør det nemt at skifte en boolesk tilstand mellem kald.
def make_toggle():
on = False
def toggle():
nonlocal on
on = not on
return on
return toggle
t = make_toggle()
print(t(), t(), t())Nulstilling af tilstand
Du kan eksponere flere indre funktioner, der deler den samme tilstand i det omsluttende område, for eksempel én til at lægge til og én til at nulstille.
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 kræver en eksisterende variabel
nonlocal kræver, at navnet allerede findes i et omsluttende område; ellers udløser Python en SyntaxError på definitionstidspunktet. Det kan ikke oprette en ny ydre variabel.
def outer():
value = 'set'
def inner():
nonlocal value
value = 'changed'
inner()
return value
print(outer())Hurtigt tjek
Inde i en indlejret funktion vil du tildele en ny værdi til en variabel fra den omsluttende funktion. Hvilket nøgleord bruger du?
Opsummering: nonlocal og ændringsbar tilstand
Opsummering:
- En tildeling til et navn i det omsluttende område opretter normalt en ny lokal variabel;
nonlocalforhindrer det. nonlocalrammer det omsluttende funktionsområde, mensglobalrammer modulet.- En ændring af et ændringsbart objekt direkte kræver ingen erklæring.
- Lukninger med
nonlocalkan oprette tællere, akkumulatorer og skift, der husker tilstand.
def make_counter():
n = 0
def inc():
nonlocal n
n += 1
return n
return inc
c = make_counter()
print(c(), c())Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 76
- Lektioner
- 320
Ofte stillede spørgsmål
Er lektionen “nonlocal og foranderlig tilstand” gratis?
Ja — hele teksten til “nonlocal og foranderlig tilstand” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “nonlocal og foranderlig tilstand”?
Redigér det omsluttende scope Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Python Academy?
Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “nonlocal og foranderlig tilstand”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Python Academy-lektion?
Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Funktioner som førsteklasses objekter
- Closures og frie variabler
- nonlocal og foranderlig tilstand
- Partielle funktioner