Ime može da se koristi samo tamo gde ga Python vidi.
Koncepti 15–17 pratili su poziv funkcije od definicije, preko ulazne vrednosti, do return-a. Sada postavi pitanje gde su imena korišćena tokom tog poziva dostupna. Koristi ovaj početnički model: ime → gde je napravljeno → gde može da se koristi.
message = "Outside"
def show_message():
message = "Inside"
print(message)
show_message()
print(message)Ovaj kod ispisuje Inside, zatim Outside. Dva pojavljivanja imena message ne znače automatski jednu istu promenljivu. Unutrašnje ime pripada show_message(); spoljašnje ime pripada okolnom programu.
Opseg odgovara na praktično pitanje: gde Python može da pronađe ovo ime? Ime napravljeno van funkcije pripada okolnom programu. Parametar ili ime napravljeno u telu funkcije pripada trenutnom pozivu te funkcije.
Drži ove dve oblasti odvojeno: VAN FUNKCIJE: message = "Outside". POZIV show_message(): napravi i koristi lokalno ime message, zatim ga ispiši. KRAJ POZIVA: ta lokalna radna imena se više ne koriste. PONOVO VAN FUNKCIJE: print(message) koristi spoljašnje ime.
def greet(name):
message = "Hello " + name
print(message)
greet("Ana")Tokom ovog poziva, name označava "Ana", a message označava "Hello Ana". Koncept 16 je pokazao da argument daje vrednost parametru; to ime parametra dostupno je unutar ovog poziva funkcije.
language = "Python"
def show_language():
print(language)
show_language()Ako Python ne pronađe ime napravljeno lokalno u funkciji, može da pročita odgovarajuće ime iz okolnog programa. Ovde ne postoji lokalno language, pa funkcija čita spoljašnju vrednost.
color = "blue"
def change_color():
color = "green"
print(color)
change_color()
print(color)Unutar funkcije color je "green". Van nje je i dalje "blue". Pravljenje lokalnog color ne zamenjuje automatski spoljašnje ime; dok Python radi unutar funkcije, lokalno ime sakriva spoljašnje ime koje se isto piše.
def make_label():
label = "Local"
print(label)
make_label()
# print(label) would not find this local name outsidelabel radi dok je Python unutar make_label(). Posle poziva, spoljašnji kod ne može jednostavno očekivati da radi print(label), jer Python tamo ne može da pronađe to lokalno ime.
def make_label():
label = "Python"
return label
course_label = make_label()
print(course_label)label je i dalje lokalno ime u make_label(). Koncept 17 daje koristan most: return šalje vrednost "Python" nazad, a spoljašnji kod je čuva pod svojim imenom, course_label. Misli ovako: lokalno ime → povratna vrednost → spoljašnje ime.
def greet(name):
message = "Hello " + name
print(message)
greet("Ana")
greet("Marko")U prvom pozivu, name je "Ana", a message je "Hello Ana". U drugom su to "Marko" i "Hello Marko". Nemoj parametar ili lokalnu promenljivu zamišljati kao jednu trajnu globalnu kutiju.
Praktičan kontrolni spisak za čitanje opsega promenljivih
- Odredi gde se nalaziš u programuDa li čitaš kod van funkcije ili unutar trenutnog poziva funkcije?
- Pronađi lokalno napravljena imenaDa li je ovo ime napravljeno u telu trenutne funkcije?
- Proveri da li postoji parametarDa li je ime parametar trenutnog poziva funkcije?
- Zatim potraži spolja ime koje može da se pročitaAko ne postoji lokalno ime, postoji li spoljašnje ime koje Python može da pročita?
- Vrati vrednost koja je potrebna van funkcijeKada je spoljašnjem kodu potrebna korisna vrednost, vrati je umesto da pokušavaš da dohvatiš lokalno ime.
Česte početničke greške
- Pretpostavljanje da isto ime znači istu promenljivuIsto ime može pripadati okolnom programu i pozivu funkcije. Proveri gde je svako ime napravljeno.
- Očekivanje da lokalna promenljiva postoji van funkcijeIme napravljeno u telu funkcije namenjeno je tom pozivu funkcije; spoljašnji kod ne može automatski da ga koristi posle završetka poziva.
- Mišljenje da lokalna promena automatski menja spoljašnje imeDodeljivanje lokalnog imena koje se isto piše ne zamenjuje automatski spoljašnje ime.
- Zaboravljanje da parametri pripadaju pozivu funkcijeArgument daje vrednost parametru tokom jednog poziva. Čitaj taj parametar kao ime dostupno unutar tog poziva.
- Pokušaj korišćenja lokalnog imena van funkcije umesto vraćanja vrednostiAko je spoljašnjem kodu potreban rezultat, koristi
returni sačuvaj povratnu vrednost pod spoljašnjim imenom. - Gubljenje iz vida kom opsegu ime pripadaZastani pri svakom korišćenju imena i zapitaj se da li Python trenutno radi unutar ili van funkcije.
