[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