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.
-
Globalna promenljiva
Napiši program u kojem definišeš promenljivu
x = 10van funkcije, a zatim je ispiši i unutar funkcije.x = 10 def prikazi(): # ispiši x pass print(x) prikazi() -
Lokalna promenljiva
Napiši funkciju koja ima lokalnu promenljivu
yi 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? -
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) -
Ista imena, različiti opsezi
Napiši program gde imaš promenljivu
zglobalno i promenljivuzunutar 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.
-
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 x ne 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:
- lokalni opseg (unutar funkcije)
- globalni opseg (u fajlu)
- 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
xlokalna promenljiva - ali lokalna
xjoš 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.
-
Prepoznavanje opsega
Posmatraj sledeći program i odgovori: da li je promenljiva
alokalna ili globalna?a = 7 def ispisi(): print(a) ispisi()Zatim objasni zašto se vrednost ispisuje bez greške.
-
Lokalna promenljiva u funkciji
Napiši funkciju koja u sebi ima lokalnu promenljivu
xi ispisuje je. Pokušaj da tu promenljivu ispišeš i van funkcije. -
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.
-
Menjanje globalne promenljive
Napiši funkciju koja menja vrednost globalne promenljive.
Uputstvo: istraži kako se koristi ključna reč
globali zašto je bez nje promena nemoguća. -
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.