Python Academy · Lektion

nonlocal og foranderlig tilstand

Redigér det omsluttende scope

Lektion 3 af 413 trin

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; nonlocal forhindrer det.
  • nonlocal rammer det omsluttende funktionsområde, mens global rammer modulet.
  • En ændring af et ændringsbart objekt direkte kræver ingen erklæring.
  • Lukninger med nonlocal kan 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())
Gratis at komme i gang

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

  1. Funktioner som førsteklasses objekter
  2. Closures og frie variabler
  3. nonlocal og foranderlig tilstand
  4. Partielle funktioner
← Tilbage til Python Academy