Opseg promenljivih (lokalno i globalno)


U Pythonu promenljive koje napraviš unutar funkcije zovu se lokalne — postoje samo dok funkcija radi. Promenljive koje napraviš izvan funkcije su globalne i dostupne svuda u tom fajlu. Važno je razumeti razliku kako bi izbegao greške.


Primer — lokalna i globalna promenljiva



# scope_primer.py
x = 10 # globalna promenljiva

def ispisi():
    y = 5 # lokalna promenljiva
    print("Unutar funkcije, y =", y)
    print("Unutar funkcije, x =", x)

ispisi()
print("Van funkcije, x =", x)
# print(y) # OVO će izazvati grešku — y nije definisano van funkcije

Za početak, preporučujemo da izbegavaš menjanje globalnih promenljivih unutar funkcije — bolje je proslediti vrednosti kroz parametre i vratiti rezultat.


Dodatni zadaci za vežbu — Opseg promenljivih u Pythonu


Ovi zadaci služe da dalje vežbaš kako se promenljive ponašaju u različitim opsezima (lokalno unutar funkcije i globalno). Poređani su od lakših ka težim.


  1. Globalna promenljiva

    Napiši program u kojem definišeš promenljivu x = 10 van funkcije, a zatim je ispiši i unutar funkcije.

    
    x = 10
    
    def prikazi():
        # ispiši x
        pass
    
    print(x)
    prikazi()
        

  2. Lokalna promenljiva

    Napiši funkciju koja ima lokalnu promenljivu y i pokušaj da je ispišeš van funkcije (trebalo bi da prijavi grešku).

    
    def test():
        y = 5
        print(y)
    
    test()
    # print(y)  # šta misliš da će se desiti?
        

  3. Promenljiva u funkciji menja globalnu

    Napiši funkciju koja koristi globalnu promenljivu i menja je pomoću ključne reči global. U glavnom programu proveri da li se vrednost promenila.

    
    a = 5
    
    def promeni():
        # koristi global a i promeni je
        pass
    
    promeni()
    print(a)
        

  4. Ista imena, različiti opsezi

    Napiši program gde imaš promenljivu z globalno i promenljivu z unutar funkcije. Ispiši obe i proveri razliku.

    
    z = 100
    
    def prikazi_z():
        z = 50
        print("Unutar:", z)
    
    prikazi_z()
    print("Globalno:", z)
        

    Uputstvo: pažljivo razmisli zašto se ispisuje različita vrednost unutar i van funkcije.


  5. Takmičarski nivo — vraćanje lokalne vrednosti

    Napiši funkciju koja ima lokalnu promenljivu brojača i vraća njenu vrednost iz funkcije. U glavnom programu pozovi funkciju više puta i ispiši rezultate tako da vidiš da je svaki poziv nezavistan.

    
    def broj_poziva():
        # koristi lokalnu promenljivu brojača
        pass
    
    print(broj_poziva())
    print(broj_poziva())
    print(broj_poziva())
        

    Uputstvo: u ovoj funkciji brojač se postavlja iznova pri svakom pozivu — razmisli šta to znači za njegov opseg.


Dodatna pojašnjenja: opseg promenljivih u Pythonu


U ovoj sekciji obrađujemo situacije koje često zbunjuju početnike i mogu dovesti do grešaka u programima.




1. Šta ako lokalna i globalna promenljiva imaju isto ime?


Pogledaj sledeći primer:



x = 10  # globalna promenljiva

def funkcija():
    x = 5  # lokalna promenljiva
    print("Unutar funkcije, x =", x)

funkcija()
print("Van funkcije, x =", x)

Rezultat:


Unutar funkcije, x = 5
Van funkcije, x = 10

Lokalna promenljiva xne menja globalnu. Python uvek prvo traži promenljivu u lokalnom opsegu funkcije.




2. Redosled traženja promenljivih (kako Python razmišlja)


Kada Python naiđe na ime promenljive, traži je ovim redosledom:


  1. lokalni opseg (unutar funkcije)
  2. globalni opseg (u fajlu)
  3. ugrađene Python promenljive

Ako promenljiva ne postoji ni u jednom od ovih opsega, Python prijavljuje grešku.




3. Česta greška: UnboundLocalError


Pogledaj sledeći kod:



x = 10

def povecaj():
    x = x + 1
    print(x)

povecaj()

Ovaj program izaziva grešku. Zašto?


  • Python vidi dodelu x = ... u funkciji
  • zato smatra da je x lokalna promenljiva
  • ali lokalna x još nije dobila vrednost



4. Korišćenje ključne reči global


Ako baš želiš da menjaš globalnu promenljivu iz funkcije, moraš to jasno da naglasiš:



x = 10

def povecaj():
    global x
    x = x + 1

povecaj()
print(x)

Rezultat:


11

⚠ Napomena: ovo je dozvoljeno, ali se u praksi preporučuje da se globalne promenljive koriste što ređe.




5. Dobra praksa: umesto globalnih — koristi parametre i return


Umesto menjanja globalnih promenljivih, bolji pristup je:



def povecaj(x):
    return x + 1

x = 10
x = povecaj(x)
print(x)

Ovakav kod je:

  • čitljiviji
  • lakši za testiranje
  • manje sklon greškama



6. Vizuelni pregled opsega promenljivih



GLAVNI PROGRAM
|
|-- globalne promenljive
|
|-- funkcija
    |
    |-- lokalne promenljive
    |
    |-- (po završetku funkcije → brišu se)

Lokalne promenljive postoje samo dok funkcija radi, a zatim nestaju.


Skriveni mini kviz — Opseg promenljivih u Pythonu

Klikni na kviz i proveri da li razumeš razliku između lokalnih i globalnih promenljivih, kao i ponašanje promenljivih u funkcijama.

Otvori kviz

Mini kviz: Opseg promenljivih

1. Koja promenljiva je globalna?


x = 10

def f():
    print(x)



2. Šta će se desiti?


def test():
    y = 5

print(y)



3. Šta će se ispisati?


a = 3

def f():
    a = 7
    print(a)

f()
print(a)



4. Čemu služi ključna reč global?




5. Šta će se ispisati?


broj = 1

def povecaj():
    global broj
    broj = broj + 1

povecaj()
povecaj()
print(broj)






Zadaci za samostalan rad — Opseg promenljivih (7. i 8. razred)


Zadaci su poređani od lakših ka težim. Cilj je da samostalno uočiš razliku između lokalnih i globalnih promenljivih i da razumeš kako Python određuje opseg važenja promenljive.


  1. Prepoznavanje opsega

    Posmatraj sledeći program i odgovori: da li je promenljiva a lokalna ili globalna?

    
    a = 7
    
    def ispisi():
        print(a)
    
    ispisi()
        

    Zatim objasni zašto se vrednost ispisuje bez greške.


  2. Lokalna promenljiva u funkciji

    Napiši funkciju koja u sebi ima lokalnu promenljivu x i ispisuje je. Pokušaj da tu promenljivu ispišeš i van funkcije.


  3. Isto ime – druga vrednost

    Napiši program u kojem postoji globalna promenljiva broj, a zatim funkcija koja ima lokalnu promenljivu istog imena, ali druge vrednosti. Ispiši obe vrednosti.

    Uputstvo: obrati pažnju na redosled izvršavanja i mesto gde se nalazi promenljiva.


  4. Menjanje globalne promenljive

    Napiši funkciju koja menja vrednost globalne promenljive.

    Uputstvo: istraži kako se koristi ključna reč global i zašto je bez nje promena nemoguća.


  5. Takmičarski nivo — brojač poziva funkcije

    Napiši program koji broji koliko puta je neka funkcija pozvana.

    Uputstvo: razmisli da li brojač treba da bude lokalna ili globalna promenljiva i zašto. Cilj je da se vrednost pamti između više poziva funkcije.


Savet: Ako nisi siguran kako se ponaša promenljiva, dodaj print() na različita mesta u programu i prati tok izvršavanja.