1. Mis on globaalne muutujad?
Globaalsete muutujate põhikontseptsioon
Globaalsed muutujad Pythoni puhul on muutujad, millele pääseb ligi kogu programmi ulatuses. Neid määratletakse funktsioonide ja klasside väliselt ning neid kasutatakse andmete jagamiseks erinevate funktsioonide või moodulite vahel. Siiski tuleb globaalseid muutujaid kasutada ettevaatlikult, kuna liigne kasutamine võib põhjustada ootamatuid vigu.
# Globaalne muutuja näide
global_var = "Globaalne muutuja"
def show_global():
print(global_var)
show_global() # Väljund: Globaalne muutuja
Globaalseid muutujaid määratletakse funktsioonide või klasside väliselt ning neid saab kasutada programmi mis tahes osas. Kuid muutmisel tuleb olla eriti ettevaatlik.
Erinevus lokaalse muutuja ja globaalse muutuja vahel
Erinevalt globaalsest muutujast on lokaalsed muutujad määratletud funktsiooni sees ja nende ulatus piirdub selle funktsiooniga. Kui funktsioon lõpetab töö, kustutatakse lokaalne muutuja ning sellele ei pääse ligi väljastpoolt funktsiooni.
def example_func():
local_var = "Lokaalne muutuja"
print(local_var)
example_func() # Väljund: Lokaalne muutuja
# print(local_var) # Viga: lokaalsele muutujale ei pääse ligi väljaspool funktsiooni
Lokaalsete ja globaalsete muutujate erinevuste mõistmine ja õige kasutamine aitab muuta koodi hooldatavamaks.

2. Globaalsete muutujate kasutamine funktsioonides
Globaalsete muutujate lugemine ja muutmine
Globaalsele muutujale pääseb ligi ka funktsiooni sees, kuid selle muutmiseks tuleb kasutada global
märksõna. Ilma selleta luuakse funktsioonis uus lokaalne muutuja sama nimega ning globaalset muutujat see ei mõjuta.
counter = 0 # Globaalne muutuja
def increase_counter():
global counter
counter += 1
increase_counter()
print(counter) # Väljund: 1
nonlocal
märksõna tutvustus
nonlocal
märksõna kasutatakse sisemises funktsioonis välimise funktsiooni lokaalse muutuja muutmiseks. See on kasulik, kui kasutatakse closure’id või hoitakse seisundit funktsioonide sees.
def outer_func():
outer_var = "Välimine"
def inner_func():
nonlocal outer_var
outer_var = "Muudetud välimine"
inner_func()
print(outer_var)
outer_func() # Väljund: Muudetud välimine
nonlocal
võimaldab sisemisel funktsioonil pääseda ligi ja muuta välimise funktsiooni lokaalseid muutujaid.
3. Globaalsete muutujate kasutamisel ettevaatusabinõud
Riskid, mis kaasnevad globaalsete muutujate ülekasutamisega
Globaalsed muutujad on mugavad, kuid nende liigne kasutamine võib põhjustada ootamatuid mõjusid kogu programmile. Kui mitu funktsiooni muudavad sama globaalset muutujat, on raske jälgida, millal ja kuidas selle väärtust muudeti, mis teeb veaotsingu keerulisemaks.
counter = 0
def increment():
global counter
counter += 1
def decrement():
global counter
counter -= 1
increment()
decrement()
print(counter) # Väljund: 0
Nagu näha, võivad globaalsed muutujad mitmes kohas muutuda ja see tekitab vigu. Seetõttu on soovitatav andmete haldamiseks kasutada teisi meetodeid.
Veakäsitlus ja silumine
Globaalsete muutujate kasutamisel võivad tekkida ootamatud vead. Veakäsitlust ja logging
moodulit kasutades on võimalik täpsustada, kus viga tekkis ja kergemini siluda.
import logging
logging.basicConfig(level=logging.DEBUG)
counter = 0
def increment():
global counter
try:
counter += 1
logging.debug(f"counter incremented: {counter}")
except Exception as e:
logging.error(f"Viga: {e}")
increment()
Seda meetodit kasutades saab salvestada, kus ja kuidas globaalset muutujat muudeti või milline viga tekkis.
4. Globaalsete muutujate parimad tavad
Globaalse muutujate kasutamine minimaalselt
Globaalseid muutujaid tuleks kasutada võimalikult vähe. Selle asemel vaheta andmeid funktsioonide argumentide ja tagastusväärtuste abil, et andmevoog oleks selgem ning vältida ootamatuid muutusi.
def add_points(score, points):
return score + points
current_score = 0
current_score = add_points(current_score, 10)
print(current_score) # Väljund: 10
Sellisel viisil saab andmeid hallata ilma globaalsete muutujateta.
Oleku haldamine klassidega
Klasside kasutamine võimaldab hallata olekut ilma globaalsete muutujateta. Klassid võimaldavad andmeid kapseldada ja muuta skoopi selgemaks.
class Game:
def __init__(self):
self.score = 0
def add_points(self, points):
self.score += points
game = Game()
game.add_points(10)
print(game.score) # Väljund: 10
Klasside kasutamine aitab hoida oleku iga instantsi sees ning takistab tahtmatuid muudatusi väljastpoolt.
5. Praktilised näited ja rakendused
Näide mängude arendamisest
Mängude arenduses kasutatakse globaalseid muutujaid skoori või elude hoidmiseks, kuid suuremates projektides on soovitatav kasutada klasse või andmebaase.
score = 0 # Globaalne muutuja
def increase_score(points):
global score
score += points
increase_score(10)
print(f"Mängija skoor: {score}") # Väljund: Mängija skoor: 10
Globaalsete muutujate kasutamine seadistuste haldamisel
Rakenduse seadistuste (nt debug-režiim või versioon) haldamiseks kasutatakse tihti globaalseid muutujaid, kuid nende tõhusamaks haldamiseks on soovitatav kasutada konfiguratsioonifaile või keskkonnamuutujaid.
config = {
'debug': True,
'version': '1.0'
}
def print_config():
print(f"Debug-režiim: {config['debug']}, Versioon: {config['version']}")
print_config() # Väljund: Debug-režiim: True, Versioon: 1.0

6. Kokkuvõte ja järgmised sammud
Globaalsed muutujad on kasulikud lihtsates olukordades, kuid nende liigne kasutamine muudab koodi keerukaks ja tekitab vigu. Kasutades funktsioonide argumente, tagastusväärtusi ja klasse, saab globaalse muutujate kasutamist minimeerida ning programmeerida turvalisemalt ja tõhusamalt.
Järgmised teemad õppimiseks
Järgmise sammuna on soovitatav uurida closure’eid, mooduli skoopi ning objektorienteeritud programmeerimist (OOP). See võimaldab kujundada keerukamaid programme ilma globaalsetest muutujatest sõltumata.
Välised ressursid ja viited
- Pythoni ametlik dokumentatsioon
Pythoni skoobi, closure’ite ja OOP kohta on põhjalik info. Eriti tasub uurida LEGB-reeglit (Local, Enclosing, Global, Built-in).
Pythoni ametlik dokumentatsioon