py30.png

Globální proměnná

Příkaz global

Chcete-li ve funkci měnit proměnnou definovanou "výše", je možné použít příkaz global. To často až zneužívají začátečníci v neznalosti jiných, lepších programátorských technik. Příkaz global by se měl využívat skutečně minimálně až vůbec.

K čemu tam tedy je? - asi GvR chce skutečně začátečníkům ten život nějak usnadnit - na malé mini prográmky, které nikdo jiný nikdy nebude muset vidět ani upravovat, to snad stačí. U větších to působí více zmatků a škody než prospěchu.:

def soucet():
    global body
    body=body+1

body=10
soucet()
print (body)  # vytiskne 11

Předáváním

Pokud můžeme, příkazu global se vyhněme čistějšími konstrukcemi. Potřebujeme-li ve funkci měnit nějakou proměnnou, je néjlépe ji tuto proměnnou předat jako argument, a od ní získat zpět výsledek. Opět i v tomto příkladě, jsou použity proměnné stejného jména, které spolu nemají vůbec nic do činění:

def soucet(body):
    body=body+1
    return body

body=10
body=soucet(body)
print (body) # vytiskne 11

Použitím měnitelných typů

Pro měnitelné datové typy (seznam, slovník, ...) platí, že není třeba používat slova global, přesto jejich obsah lze měnit vždy a všude. Je nutné je založit v nejvyšší úrovní programu a ve funkcích pak používat:

def soucet():
  body[0]=body[0]+1

body=[10]
soucet()
print (body)  # vytiskne [11]

Použitím atributů instancí

Atributy instance jsou také měnitelné, takže není třeba global. Jedná se snad o nejčistčí, nejpřehlednější řešení (pokud nepočítáme Předávání):

class tridaBody:
    pass

def soucet():
    body.soucet = body.soucet + 1

body=tridaBody()
body.soucet=10

soucet()
print (body.soucet)   # vytiskne 11

Stejný název, jiné hodnoty

Naopak se často využívá toho, že můžeme ve funkcích používat stejné názvy proměnných jako v hlavním programu bez obavy, že dojde k ovlivnění. Zajišťují to separované prostory jmen funkcí, modulů i programů. V následujícím příkladě jsou dvě, naprosto nezávislé proměnné stejného jména body:

def soucet():
    body=1
    body=body+1
    print  ("Body z funkce:", body) # vytiskne 2

body=10
soucet()
print ("Body z hlavniho programu:", body)    # vytiskne 10

Omezení

Proměnné použité jako global se ve funkci nesmí objevit jako parametry funkce, jako řídící proměnná ve smyčce for, jako jména tříd a funkcí, v příkazu import.