Edit detail for Globální proměnná revision 1 of 1

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.



 






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.