Globalne promenljive - ★★ Fog Developer ★★

Novo

6/recent/ticker-posts

Globalne promenljive

Python 3 - Globalne promenljive

9.3 Globalne promenljive - zašto postoje?

Da li bi ljudska vrsta bila toliko moćna da ne može da menja neke globalne stvari – da gradi, ruši, da menja prirodne zakone? Ne, ne bi smo bili uopšte različiti od obične biljke! Mi imamo, hoćemo i možemo da menjamo svet, postoje alati kojima svoje želje (gramzivost, pohlepu, sebičnost, sadizam) pretvaramo u stvarnost! Pa zašto nam onda Python da nas zakida za to pravo nad prirodom, za koje su se izborile generacije i generacije naših predaka u nemilosrdnom i krvavom ratu protiv prirodnih lepota, koji još uvek traje? (kraj sarkazma)

Lagano. Ne žuri i svoje znanje koristi za dobrobit. Poneki put je čoveku potrebno da menja stvari koje nemaju uticaj samo na njega, već i na gomilu drugih ljudi. Ako stvari nisu poželjne niti dobre, onda ih ni ne treba raditi na globalnom nivou.

Na sličan način se razmišlja i u programiranju. Neće Python uskratiti delić naše „ljudske“ moći. Naravno da možeš da utičeš i na glavne tokove, što su u programiranju promenljive, ali to moraš raditi oprezno.

Kako pristupiti varijabli koja nije definisana u okviru funkcije?

Ako baš želiš da menjaš vrednost promenljive koja je definisana u glavnom delu programa  (stručnije rečeno: nije u delokrugu funkcija ili klasa), onda moraš da kažeš Python-u da ime koje tražiš nije lokalno za funkciju, već da misliš na spoljni deo te funkcije – tj. ime je globalno.

To „govoriš“ Pythonu koristeći komandu global.

Nemoguće je menjati vrednosti promenljivim koje su definisana izvan funkcije bez global naredbe.

Drugim rečima, global naredba omogućava da funkcija komunicira sa svetom „kroz prozor“. Više ne moraš da joj na vrata daješ vrednosti! 

Ti možeš da koristiš vrednosti promenljivih definisanih izvan funkcije (koje se iz tog razloga i nazovaju globalne promenljive) pod pretpostavkom da u samoj toj funkciji nije definisana neka lokalna promenljiva sa identičnim imenom, jer u tom slučaju ovo baš i neće raditi kako je zamišljeno.

Kada (ne)koristiti globalne promenljive?

Pristup globalnim promenljivima zvuči odlično jer onda možemo da definišemo sve varijable na jednom mestu, bez potrebe da ih koristimo u funkcijama, klasama i sl. Međutim, kao i sve ideje koje na početku zvuče supe, ni ovo ne bi trebao raditi tako često i bez potrebe. Zapravo, u početku bi trebalo da  se izbegava u širokom luku (a uskoro će ti biti i jasno zašto).

Zamislite samo kakav bi to bio nered, jer je takav pristup rešavanju problema prilično konfuzan i nejasan, kako nekim drugim čitaocima tvog programa, tako i samom tebi. Može se potrošiti dosta vremena u pronalaženju samog mesta gde je promenljiva koju menjamo definisana i čemu ona uopšte i služi, kada se tako lako menja?

Ako koristiš naredbu global svima koji poznaju Python je dovoljno jasno da se misli na promenljivu koja je definisana u spoljašnjem bloku, tj. izvan funkcije ili klase.

Primer korišćenja globalne promenljive

Hajde da se vratimo na naš primer sa skijašem... 

Pošto on mrzi zimu, a voli skijanje, opet se smrzao dok je išao do hotela... Sutradan je na svom brzom spustu, krajičkom oka ugledao jednu građevinu, za koju je pomislio da će mu dobro poslućiti svrsi... Opet je bilo jako hladno napolju, i naš junak je odlučio da malo ugreje ceo svet....

>>> # Napolju 
... 
>>> temperatura = 'Jako hladno' 
>>> def fukushima(): 
... # idemo kroz prozor, ovo je neka ruina od zgrade 
... # Zar je i unutra jako hladno? 
...     global temperatura 
... # Hej, vidi-vidi, ovde je neko dugme 
... # hajde da ga stisnemo 
...     temperatura = 'pakleno toplo' 
... # bum!
...     print(temperatura) 
... 
>>> # Idemo u fukoshimu 
... 
>>> fukushima() 
pakleno toplo 
>>> # jupi, ugrejani smo... Izlazimo na sneg sa namerom da idemo nazad u hotel... 
... 
>>> print(temperatura) 
pakleno toplo 
>>> # Ups.... 
... 
>>> 

Upotrebom komande global, naš mali junak ne samo da se ugrejao, već je ugrejao ceo svet! Izazvao je GLOBALNO zagrevanje.... I sad naš (ne)srećnik izlazi na skijašku stazu.... Ali to više nije nikakva  skijaška staza, već obična livada.

Ukratko govoreći – programirajući imaš svu slobodu ovog sveta da radiš šta te je volja. Tako isto, imaš i slobodu da koristiš i lokalne i globalne promenljive na način koji tebi odgovara, ali pazi na rezultate svoga rada.

Šta ako nisi želeo ovu novu vrednost menjajući staru u nekoj trivijalnoj funkciji? Zapamti ovo pravilo, kako u životum tako i u programiranju: ako nešto možeš da uradiš, to ne znači da to i treba da uradiš!

Klasičan primer šta se može, a ne bi trebalo

Da se vratimo u realnost, tebi niko ne brani da uradiš ovo:

>>> def print(p): 
...     input(len(p)) 
... 
>>> print('abrakadabra') 
11 
>>> 

Upravo si definisao print funkciju, koja ne radi ni približno ono na šta si se već navikao. 

Desilo se da si definisao ime koje je već definisano u samom Pythnu! Sada uživaj u novoj print funkciji koja ne radi ništa korisno!

Kmeee.... Zeznuo si mi računar!

Ma samo restartuj Python prompt... Ne brini se...

I tvoji programi imaju svoj delokrug delovanja, tako da Pythonov prompt ima svoj okvir u kojem će promenljive definisane u realnom vremenu imati značaj.

Imaj malo poverenja, ja ti na ovom mestu sigurno neću pokazati išta što bi moglo da naudi normalnom funkcionisanju bilo čega na tvom računaru.

Ovaj primer pokazuje kako se sa malom nepažnjom može dosta toga pokvariti.

9.2 Lokalne promenljive Indeks 9.4 Definisanje podrazumevanih argumenata funkcije
9.2 Lokalne promenljive Indeks 9.4 Definisanje podrazumevanih
argumenata funkcije

Постави коментар

0 Коментари