Funktsioonid
Lokaalsed ja globaalsed muutujad

Antud näites on oluline tähele panna erinevaid muutuja nimesid funktsiooni sees ja väljaspool funktsiooni, kuigi tähendavad need muutujad ju mõlemal korral silindri kõrgust ja silindri raadiust. Siin tulevadki mängu mõisted lokaalne ja globaalne muutuja.
Lokaalseks muutujaks nimetakse muutujat, mis asub funktsiooni sees. Selles näites siis muutujad h, r ja ruumala on lokaalsed. Muutujad kõrgus ja raadius on aga globaalsed. Mis neil vahet on, miks kutsutakse ühte lokaalseks aga teist globaalseks?
Enne kui lähen täpse selgituse juurde, räägin sulle veidi taustast. Muutujate loomine Pythonis on seotud mälu haldamisega. Nimelt ei ole Pythonis vaja mälu peale selle kasutusele võtmist uuesti vabastada, seda teeb Python meie eest ise. Mitmes teises programmeerimiskeeles (C, C++) on vaja muutujate poolt hõivatud mälu ise vabastada. Kui seda ei tehta, võib mälu suht kiiresti täis saada ja arvuti muutub siga-aeglaseks.
Lokaalse ja globaalse muutuja vahe seisneb nende muutujate mõjuala suuruses. Pythonis on kõik funktsioonide sees olevad muutujad lokaalsed muutujad ja neid muutujaid ei saa väljaspool funktsiooni kasutada. Kui ma näiteks kirjutaksin programmi lõppu veel ühe print rea ja tema sulgudesse kirjutaksin funktsioonimuutuja ruumala, siis saaksin veateate, mis ütleb, et programm sellist muutujat ei tunne. Pythonis on nii korraldatud, et enne funktsiooni tööle hakkamist ei eksisteeri tegelikult funktsiooni sees kasutatavad muutujad. Alles siis kui funktsioon välja kutsutakse tekitab Python vastavad muutujad (lokaalsed), antud juhul h, r ja ruumala ning omistab neile seal samas väärtused. h saab väärtuse argumendilt kõrgus ja r saab väärtuse argumendilt raadius. Ruumala leitakse muutujate pi, h ja r korrutamise teel. Kohe kui funktsioon on tulemuse väljakutsujale ehk ruumala küsijale tagastanud, kustutab Python kõik funktsioonis kasutusel olnud muutujad - mälu vabastatakse ja nii muutuvadki funktsiooni muutujad programmi jaoks taas olematuks.
Globaalsed muutujad seevastu eksisteerivad kogu programmi töö vältel ja neid saab kasutada igal pool, ka funktsioonide sees.

Kui mujal programmi koodis saab globaalset muutujat iga kell muuta siis funktsiooni sees seda niisama teha ei saa, saab vaid kasutada tema väärtust. Miks nii? Kohe kui ma tahaksin näiteks funktsiooni sees globaalsele muutujale raadius anda uue väärtuse, näiteks nii raadius=20, siis tegelikult selline rida globaalset muutujat ei muuda, sest nagu ma ennist ütlesin, kõik muutujad, mis asuvad funktsiooni sees, luuakse uuesti, isegi kui sellel on sama nimi mis globaalsel muutujal. Sellises olukorras luuakse lihtsalt uus globaalse muutujaga samanimeline kuid lokaalne muutuja.
Globaalse muutuja muutmine funktsiooni sees
Kui mul on aga vaja ikkagi mõne funktsiooni sees muuta globaalset muutujat, siis tuleb globaalse muutuja nime ette kirjutada global, sellisel juhul muudab funktsioon tõesti globaalset muutujat ja ei tee valmis ajutise samanimelise lokaalse muutuja.
Pikk jutt räägitud, vaatame kuidas see muutujate asi ka reaalselt programmeerimise juures välja näeb.