← Python/Denken in functies
Les 4 van 8
MODULE 03 · 04◷ 24 min

Houd lokale namen lokaal

Na deze les kun je
  • Lokale en buitenste namen onderscheiden
  • Een parameter met dezelfde naam gebruiken
  • Onbedoelde globale wijzigingen voorkomen

Je wilt even bekijken wat een andere instelling oplevert, zonder de gewone instelling te veranderen. Na die preview moet de rest van je programma hetzelfde blijven werken. Daarvoor moet je weten waar een naam bij hoort.

Dezelfde spelling, een andere plek

Het bereik van een naam bepaalt waar Python die naam kan vinden. Een lokale naam hoort bij een bepaalde functieaanroep. Een parameter is zo'n lokale naam: hij krijgt zijn waarde wanneer die aanroep begint.

Een globale naam staat in deze voorbeelden buiten de functies, in hetzelfde Python-bestand. Een functie kan die naam lezen wanneer er geen gelijknamige lokale naam voor in de plaats komt. Alleen lezen vraagt geen global-opdracht.

Een gewone toekenning binnen een functie maakt de naam daar lokaal. Daardoor kunnen een lokale en een globale naam hetzelfde gespeld zijn en toch verschillende waarden hebben. De naam zegt dus niet alles; kijk ook waar hij wordt gebruikt en toegekend.

Een preview met een eigen instelling

Dit voorbeeld telt normaal vier bij de invoer op. De preview probeert tijdelijk tien. Druk op Voorbeeld uitvoeren en let vooral op de derde uitvoerregel, wanneer de gewone berekening opnieuw wordt aangeroepen.

Een lokale preview naast de gewone instelling
offset = 4

def regular(value):
    return value + offset

def preview(value):
    offset = 10
    return value + offset

print(regular(3))
print(preview(3))
print(regular(3))
print(offset)
Verwachte uitvoer
7
13
7
4

De eerste gewone aanroep geeft zeven. De preview geeft dertien, omdat zijn lokale offset tien is. Daarna geeft de gewone functie opnieuw zeven: de globale offset is niet veranderd.

PlekNaamWaardeGebruikt door
Buiten de functiesoffset4regular
Binnen één preview-aanroepoffset10Die preview
Binnen elke aanroepvalueHet meegegeven getalDe aangeroepen functie

De twee waarden van offset hoeven niet met elkaar te worden gesynchroniseerd. Het zijn aparte namen op aparte plekken. De laatste print(offset) staat buiten de functies en toont daarom de globale waarde vier.

Zo kun je een tijdelijke berekening een eigen instelling geven. Zodra de aanroep klaar is, hoeft de aanroeper alleen de retourwaarde te gebruiken. Je hoeft niet achteraf een gedeelde instelling terug te zetten.

Veelgemaakte fout: de preview verandert de rest

Met global offset zeg je juist dat toekenningen aan offset in deze functie naar de globale naam gaan. Dat kan bewust worden gebruikt, maar past niet bij een preview die niets blijvend mag veranderen. Deze zelfstandige foutvariant laat het gevolg zien.

Een preview die de gedeelde instelling verandert
offset = 4

def regular(value):
    return value + offset

def preview(value):
    global offset
    offset = 10
    return value + offset

print(regular(3))
print(preview(3))
print(regular(3))
print(offset)
Verwachte uitvoer
7
13
13
10

De preview lijkt nog steeds goed te rekenen: hij geeft dertien. Het probleem verschijnt bij de volgende gewone aanroep, die nu ook dertien oplevert. De toekenning heeft de globale instelling veranderd van vier naar tien.

Een los goed antwoord bewijst dus niet dat de functie zich goed gedraagt bij hergebruik. Vergelijk ook wat er na de aanroep gebeurt. In dit geval is de reparatie het weglaten van global, zodat de preview zijn eigen lokale instelling houdt.

Lezen, meegeven of veranderen

Gebruik een parameter als de aanroeper de instelling voor die ene berekening moet kiezen. Ook als er buiten de functie een gelijknamige naam bestaat, gebruikt de functie dan de lokale parameter. Een meegegeven tarief hoeft niet eerst in een globale instelling te worden opgeslagen.

De opdrachten laten je deze keuzes afzonderlijk maken. Sommige functies lezen een buitenste waarde, andere gebruiken een lokale instelling of parameter. De tests doen ook herhaalde aanroepen, zodat een onbedoelde wijziging van een gedeelde waarde zichtbaar wordt.

De buitenste base_rate begint op vijf, maar kan later veranderen. cost moet steeds de huidige buitenste waarde lezen; vijf lokaal vastzetten voldoet daarom niet.

AAN DE SLAG 0/4
1

Lees een buitenste naam

Gebruik in cost de huidige buitenste base_rate (begint op vijf); verwijder de lokale overschrijving.

2

Gebruik een eigen lokale waarde

Laat preview tarief negen gebruiken zonder de buitenste base_rate te wijzigen.

3

Gebruik de parameter

Laat quote rekenen met zijn eigen base_rate-parameter.

4

Maak herhaalde aanroepen voorspelbaar

Laat add_fee steeds twee optellen zonder fee te veranderen.

Wat je meeneemt

  • Parameters en gewone toekenningen binnen een functie vormen lokale namen.
  • Een functie kan een buitenste naam lezen zonder global te gebruiken.
  • global kan een wijziging laten doorwerken in latere aanroepen; kies bewust of dat bij de taak hoort.

Hierna laat je een functie meerdere samenhangende waarden in één antwoord teruggeven.

main.py
UitvoerPython
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.