1 | ||
Editor: pycz
Time: 2011/10/15 11:50:53 GMT+2 |
||
Note: oprava |
changed: - .. image:: py30.png :align: right 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.
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
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
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]
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
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
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.