Perusperiaate
ohjelmoinnissa on se, että kaikki ohjelmakoodi ja muuttujat tulisi sijoittaa funktioihin.
Näin koodista tulee organisoitua ja mahdollisten virheiden löytyminen onnistuu helpommin.
Siksi Python-ohjelman tulisi koostua vain itsenäisistä funktioista ja muutamasta “peruskoodirivistä”.
Yleensä parametreilla ja funktioiden omilla, paikallisilla muuttujilla ja paluuarvoilla pystyy tekemään kaiken tarvittavan.
Itsenäistä funktiota voi käyttää uudestaan myös jossain toisessa ohjelmassa,
esimerkkinä vaikka laiteläheisen koodin LEDin vilkutus, sarjaportin käsittely tai LCD-näytön ohjaus.
Yhteiset eli globaalit muuttujat
Pythonin koodissa on ns. päätaso, eli taso, jossa ei ole yhtään sisennystä (sisennystaso 0).
Jos määrittelet päätasolla muuttujia se tehdään kaikkien funktioiden ulkopuolella.
Siksi ne ovat yhteisiä eli globaaleja ja ne ovat käytettävissä kaikkialla ohjelmassa.
Mutta.
Globaalien muuttujien ongelmana on mahdollisten virheiden lisääntyminen ja toisaalta se tuhlaa,
etenkin sulautetuissa systeemeissä, muutenkin niukkaa käyttömuistia.
Joten niiden käyttöä tulee välttää.
Oikeastaan ei pitäisi käyttää lainkaan.
Miksi?
Siksi, että missä tahansa koodia mikä tahansa muutos voi muuttaa globaalin muuttujan arvoa.
Isohkon ohjelman toimintaa voi olla vaikea seurata, jos/kun useampi funktio käyttää samoja globaaleja muuttujia.
Pienissä ohjelmissa pieni haitta, isoissa iso.
Joskus kuitenkin on käytettävä yhteisiä eli globaaleja muuttujia, niin on se toki sallittua.
Tätä varten Pythonissa on olemassa varattu sana global,
jonka avulla käyttäjä voi halutessaan käyttää ylemmän tason (päätason) muuttujia paikallisten muuttujien sijaan.
Me kuitenkin tähtäämme oikeaoppiseen työskentelyyn ja emme globaaleihin sorru.
Eika vaa?
Paikallinen muuttuja ja näkyvyys
Funktion sisällä määritellyt muuttujat eivät ole käytettävissä sen ulkopuolella.
Funktion sisäisen, siis paikallisen, local, muuttujan arvoa voi muuttaa ainoastaan tässä funktiossa.
Jos siinä esiintyy virhe, yksittäisen funktion tarkastus on pienempi vaiva kuin koko ohjelman läpikäyminen.
Muuttujat esitellään aina funktion alussa.
Muuttuja näkyy vain omalla näkyvyysalueellaan, joka paikallisella muuttujalla on ko. funktio.
Näkyvyysalueen, scope, perusteella meillä on kahdenlaisia muuttujia: local ja global.
Näkyvyysalue kertoo, missä ja milloin muuttuja on olemasssa ja sen arvo on saatavilla.
Globaalit muuttujat, jotka on määritetty funktioiden ulkopuolella, näkyvät kaikkialla koodissa, global scope.
Funktion sisällä määritetty muuttuja näkyy vain tämän funktion sisällä, local scope.
Paikallinen muuttuja ja sen arvo säilyvät vain tämän funktion elinajan.
Kun poistumme funktiosta, ei muuttujaa eikä funktiotakaan ole enää datamuistissa.
Siksi muuttuja ei näy toisessa funktiossa, eikä sitä voi siellä käyttää.
”Kuollut mikä kuollut”.
Teknisesti
Funktion kutsun yhteydessä tietokone varaa muuttujia varten tarvittavan määrän muistia.
Funktion loputtua tietokone vapauttaa muuttujia varten varatun muistin.
Eri funktioissa esiintyvät samannimisetkin muuttujat ovat kaikki täysin itsenäisiä ja erillään toisistaan.
Tästä seuraa, että voit luoda kahteen eri funktioon samannimisen muuttujan,
koska funktioiden välillä muuttujilla ei ole minkäänlaista yhteyttä.
Selvyyden vuoksi: älä kuitenkaan tee niin.
Paikallinen versus yhteinen muuttuja
Local versus global variable
Analyysi:
Funktion kutsussa parametri para on arvoltaan 50 ja se kopioidaan funktion parametrin arvoksi.
Tämän jälkeen muutamme funktion sisällä muuttujan para arvoksi 2.
Tämä ei kuitenkaan vaikuta päätason muuttujan, global, para arvoon mitenkään.
Tämä johtuu siitä, että muuttujat ovat vain samannimisiä, ne eivät ole sama muuttuja.
Kun tullaan ulos funktiosta, funktio lakkaa olemasta ja samoin käy sen muuttujalle.
Siksi pääohjelman para-muuttuja on edelleen 50.
Funktiokutsussa parametrina välitetään ainoastaan muuttujan arvon kopio.
Funktio tekee muutoksen kopioon, mutta ei voi vaikuttaa globaaliin muuttujaan, koska “se ei näe sitä”.
Tämä oli vain esimerkki, jotta ymmärtäisit globaalin ja locaalin muuttujan eron.
Globaalin muuttujan käyttö
Funktio näkee globaalit eli funktioiden ulkopuolella määritellyt muuttujat avainsanan global avulla.
Analyysi:
Jos muuttuja määritetään funktion sisällä se on ns paikallinen muuttuja ja se on toiminnassa,
näkyvissä, vain tuon muuttujan sisällä. Vaikka sillä olisi sama nimi kuin ulkoisella muuttujalla.
Vaikka sama nimi, nuo ovat eri muuttujia.
Jos kuitenkin haluat muuttaa ulkoisen muuttujan arvoa, se otetaan funktion sisällä käyttöön varatulla sanalla global,
sillä kerrotaan tulkille, että funktio käyttää ylemmän tason muuttujaa.
Nyt siihen voidaan asettaa uusi arvo ja muutos näkyy myös funktion ulkopuolella.
Global-määrityksen ansiosta funktion sisällä tehdyt muutokset muuttujaan jäävät voimaan myös funktion suorituksen jälkeen.
Sisennys-tasolla nolla, eli pääohjelmassa määritetty globaali luku-muuttuja otetaan tuplaa-funktiossa käyttöön avainsanalla global.
Siksi funktiossa muuttujaa voidaan manipuloida ja se saadaan tuplattuna näkyviin pääohjelmassa.
Parametria ei käytetä tässä koska käytämme globaalia muuttujaa.
Muista
Vaikka globaalin muuttujan käyttö “säästää” parametrin käytön, vältä niiden käyttöä.
On turvallisempaa käyttää datan välityksessä funktioiden välillä parametreja ja
return-paluuarvoja kuin globaaleja muuttujia.
On viisasta oppia heti välttämään globaalien muuttujien käyttöä.
Tämä ja edellinen koodi oli vain malli, josta selviää muuttujien näkyvyyserot.