Python - Globalne ključne riječi (Global Keyword)


Šta su globalne ključne (global keyword) riječi?

U Pythonu, globalna ključna riječ (global keyword) vam omogućava promjenu varijable izvan trenutnog opsega. Koristi se za stvaranje globalne varijable i unošenje promjena u lokalnom kontekstu varijable.



Pravila globalne ključne riječi

Osnovna pravila za globalnu ključnu riječ (global keyword) u Pythonu su:

  • Kada kreiramo varijablu unutar funkcije, ona je prema zadanim postavkama lokalna.
  • Kada definišemo varijablu izvan funkcije, ona je prema zadanim postavkama globalna. Ne morate koristiti globalnu ključnu riječ (global).
  • Koristimo globalnu ključnu riječ za čitanje i pisanje globalne varijable unutar funkcije.
  • Upotreba globalne ključne riječi izvan funkcije nema efekta.


Upotreba globalne ključne riječi

Pogledajmo primjer.


Primjer 1: Pristup globalnoj varijabli iz funkcije

c = 1 # globalna (global) varijabla

def add():
    print(c)

add()

Kada pokrenemo gornji program, izlaz će biti:


1


Međutim, možemo imati neke scenarije u kojima trebamo modifikovati globalnu varijablu unutar funkcije.


Primjer 2: Modifikovanje globalne varijable unutar funkciji

c = 1 # globalna (global) varijabla
    
def add():
    c = c + 2 # increment c za 2
    print(c)

add()

Kada pokrenemo program, izlaz prikazuje grešku:


UnboundLocalError: local variable 'c' referenced before assignment


To je zato što možemo pristupiti samo globalnoj varijabli, ali je ne možemo mijenjati unutar funkcije. Rješenje za to je korištenje ključne riječi global.


Primjer 3: Promjena globalne varijable unutar funkciji pomoću global

c = 0 # globalna (global) varijabla

def add():
    global c
    c = c + 2 # increment za 2
    print("Unutar add():", c)

add()
print("Uglavnom:", c)

U gornjem programu definišemo c kao globalnu ključnu riječ unutar funkcije add(). Zatim, povećavamo varijablu c za 1, tj. c = c + 2. Nakon toga pozivamo funkciju add(). Na kraju, ispisujemo globalnu varijablu c. Kao što vidimo, promjena se dogodila i na globalnoj varijabli izvan funkcije, c = 2.



Globalne varijable u Python modulima

U Pythonu kreiramo jedan modul config.py za zadržavanje globalnih varijabli i razmjenu informacija između Python modula unutar istog programa. Evo kako možemo dijeliti globalne varijable kroz python module.


Primjer 4: Podijela globalne varijable između Python modula

Kreirajte datoteku config.py za pohranu globalnih varijabli.

a = 0
b = "empty"

Kreirajte datoteku update.py za promjenu globalnih varijabli.

import config

config.a = 10
config.b = "alphabet"

Kreirajte datoteku main.py da biste testirali promjene u vrijednosti.

import config
import update

print(config.a)
print(config.b)

U prethodnom primjeru stvorili smo tri datoteke: config.py, update.py i main.py. Modul config.py pohranjuje globalne varijable a i b. U datoteku update.py uvozimo modul config.py i mijenjamo vrijednosti a i b. Slično tome, u datoteku main.py uvozimo i config.py i update.py modul. Na kraju, ispisujemo i testiramo vrijednosti globalnih varijabli bez obzira jesu li promijenjene ili ne.



Globalne u ugniježdene funkcije

Evo kako možete koristiti globalnu varijablu u ugniježdenoj funkciji.


Primjer 5: Korištenje globalne varijable u ugniježdenoj funkciji

def foo():
    x = 20

    def bar():
        global x
        x = 25
    
    print("Prije pozivanja bar: ", x)
    print("Pozovi bar sada")
    bar()
    print("Nakon poziva bar: ", x)

foo()
print("x je uglavnom: ", x)

U gore navedenom programu proglasili smo globalnu varijablu unutar ugniježdene funkcijske bar(). Unutar funkcije foo(), x nema efekat globalne ključne riječi.

Prije i nakon poziva bar(), varijabla x poprima vrijednost lokalne varijable, tj. x = 20. Izvan funkcije foo(), varijabla x poprimiće vrijednost definisanu u funkciji bar(), tj. x = 25. Ovo se dešava, jer smo koristili globalnu ključnu riječ u x za stvaranje globalne varijable unutar funkcije bar() (lokalni opseg (local scope)). Ako napravimo bilo kakve promjene unutar funkcije bar(), promjene se pojavljuju izvan lokalnog opsega, tj. foo().