Lees een buitenste naam
Gebruik in cost de huidige buitenste base_rate (begint op vijf); verwijder de lokale overschrijving.
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.
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.
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.
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)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.
| Plek | Naam | Waarde | Gebruikt door |
|---|---|---|---|
| Buiten de functies | offset | 4 | regular |
| Binnen één preview-aanroep | offset | 10 | Die preview |
| Binnen elke aanroep | value | Het meegegeven getal | De 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.
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.
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)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.
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.
Gebruik in cost de huidige buitenste base_rate (begint op vijf); verwijder de lokale overschrijving.
Laat preview tarief negen gebruiken zonder de buitenste base_rate te wijzigen.
Laat quote rekenen met zijn eigen base_rate-parameter.
Laat add_fee steeds twee optellen zonder fee te veranderen.
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.
Voer je code uit en ontdek
wat je hebt gemaakt.
Je hoeft het niet in één keer goed te doen. Na het uitvoeren zie je hier welke stappen al kloppen.