[Tutor PyCZ] seznam jako globální proměnná

Petr Prikryl PrikrylP na skil.cz
Úterý Březen 27 07:57:09 CEST 2007


Jan Šimůnek se ptá
>
> dá se seznam jako celek nastavit jako globální proměnná?
> [...]
> nebo to musím zase prohnat cyklem a každou položku 
> nastavit jako global (v proceduře, která bude příslušná 
> data zpracovávat). A pokud ano, jaká je korektní syntaxe?

Pojem "globální proměnná" souvisí s viditelností
jména odevšad. Nesouvisí nijak s datovým typem
objektu, který označuje. Proto i seznam může být
globální. V Pythonu se jméno proměnné svazuje
s objektem při zápisu přiřazení.

Váš problém asi spočívá v tom, jak dát najevo
uvnitř funkce, že chcete, aby se nevytvořila 
nová proměnná, ale aby se pracovalo s již existující,
definované na globální úrovni.

Pokud potřebujete seznam jen číst, nemusíte dělat
nic. Najde se na nejbližší vyšší úrovni. Takové
proměnné se pak v Pythonu říká "volná proměnná":

seznam = [1, 2, 3]

def funkce():
    for polozka in seznam:
        print polozka

funkce()    # voláme

Pokud do seznamu chcete přidávat, půjde to
taky, protože se odkazujete na již existující
objekt a voláte jeho metodu (funkce přidá
položky, mimo funkci vytiskneme):

seznam = [1, 2, 3]

def funkce():
    seznam.append(4)
    seznam.append(5)
    seznam.append(6)

funkce()
for polozka in seznam:
    print polozka

Problém nastává jen v případě, kdy se snažíte
jméno "seznam" svázat s novou hodnotou příkazem
přiřazení. V takové situaci se vždy vytvoří 
lokální jméno a navenek nebude činnost těla
funkce patrná:

seznam = [1, 2, 3]

def funkce():
    seznam = [4, 5, 6]

funkce()
for polozka in seznam:
    print polozka

Dá se to vyřešit tím, že jméno seznam 
se nemá vytvářet jako lokální, ale že 
se má použít globální. K tomu slouží příkaz 
global (je úplně jedno, objekt jakého typu
je na jméno navázán):

seznam = [1, 2, 3]

def funkce():
    global seznam
    seznam = [4, 5, 6]

funkce()
for polozka in seznam:
    print polozka

Obecně je ale lepší, když se globálním
proměnným budete velkým obloukem vyhýbat,
protože jsou zdrojem problémů. Konkrétní
objekt vždy funkci předávejte přes parametr
a nové hodnoty vracejte jako hodnotu funkce.
Umělý příklad by vypadal takto:

seznam1 = [1, 2, 3]

def funkce(seznam):
    print seznam
    return [4, 5, 6]

seznam2 = funkce(seznam1)
print seznam2

V Pythonu vždy uvažujte tak, že jméno
není důležité. Důležitý je objekt, se kterým
je svázáno.

pepr


Další informace o konferenci Tutor