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.