Lokální proměnná
V programování je lokální proměnná označení pro proměnnou, jejíž oblast platnosti (anglicky scope) je omezena na určitou proceduru, funkci nebo blok. Reference na proměnnou deklarovanou ve funkci nebo bloku programu přepíše viditelnost proměnné se stejným jménem deklarovanou ve vyšší oblasti platnosti. V programovacích jazycích využívajících pouze dvě úrovně viditelnosti je lokální proměnná opakem globální proměnné. Na druhou stranu mnoho jazyků odvozených z jazyka ALGOL povoluje libovolný počet vnořených úrovní viditelnosti. Lokální proměnné jsou základem procedurálního programování a modulárního programování obecně: proměnné s lokální oblastí platnosti jsou používány pro předejití problémů s vedlejšími účinky, které mohou nastat s použitím globálních proměnných.
Ve většině programovacích jazyků jsou lokální proměnné uloženy na zásobníku volání. To znamená, že při každém volání rekurze se lokální proměnné každé instance podprogramu uloží odděleně do adresové paměti. Proto mohou být proměnné v oblasti této instance deklarované, přepisované a čtené bez rizika ovlivnění funkce mimo blok, ve kterém byli deklarovány.
Oblast platnosti
Lokální proměnné mohou mít lexikální nebo dynamickou oblast platnosti. Většina ostatních jazyků používá lexikální (statickou) oblast platnosti lokálních proměnných. K jazykům, které podporují dynamické oblasti platnosti patří Logo, Emacs lisp a interprety příkazů bash, dash a „lokální“ deklarace v MirBSD Korn shellu (mksh). Některé jazyky jako Perl nebo Common Lisp dovolují programátorovi při definici nebo redefinici proměnné vybírat mezi statickou a dynamickou oblastí platnosti.
Lexikální oblast platnosti
Pro lexikální oblast platnosti platí, že pokud je jméno proměnné vytvořené v konkrétním bloku programu, potom je proměnná viditelná v tomto bloku, ne však ve vyšších (obklopujících) blocích. Ve vnořených blocích je proměnná viditelná, pokud ve vnořeném bloku není vytvořena jiná proměnná se stejným jménem.
Dynamická oblast platnosti
Dynamická oblast platnosti znamená, že pokud je proměnná deklarována nebo vytvořena v určitém bloku, pak je její oblastí platnosti nejen tento blok, ale i všechny funkce z něho vyvolané (tranzitivně), kromě funkcí, ve kterých je jméno překryté jinou deklarací. Proměnná přestává existovat při opuštění bloku, v němž je deklarována.
Doba existence
Typická lokální proměnná vzniká se vstupem do bloku, ve kterém je deklarována nebo použita, přetrvává i po dobu provádění vnořených bloků nebo vyvolaných procedur a funkcí a zaniká při opuštění svého bloku. Jinou dobu existence mají statické lokální proměnné.
Statické lokální proměnné
Specifickým druhem lokální proměnné je statická lokální proměnná, která je dostupná v mnoha běžně používaných jazycích (včetně C/C++, Visual Basic a VB.NET) dovolujících uchovat hodnotu proměnné mezi jednotlivými voláními funkce, ve které je deklarovaná. V tomto případě mají i rekurzivní volání přístup k společné proměnné na jednom místě paměti.
Statické lokální proměnné deklarované v globálních funkcích mají stejnou životnost jako statické globální proměnné, protože zůstávají v paměti po celou dobu běhu programu. Toto chování je odlišné od jiných využití klíčového slova static
, které má několik rozdílných významů v různých programovacích jazycích.
Lokální proměnné v jednotlivých programovacích jazycích
Perl
Perl podporuje dynamické i lexikální typy lokálních proměnných. Klíčové slovo local
je použito pro definování lokální proměnné s dynamickou oblastí platnosti. Naproti tomu klíčové slovo my
je použito pro lokální proměnnou s lexikální oblastí platnosti.
K pochopení funkce uvažujme následující kód
$a = 1;
sub f() {
local $a;
$a = 2;
g();
}
sub g() {
print "$a\n";
}
g();
f();
g();
výstupem bude:
1
2
1
Tento výsledek nastane proto, že globální proměnná $a je modifikovaná na novou dočasnou lokální proměnnou uvnitř funkce f(), ale po opuštění funkce je její hodnota obnovena na předchozí hodnotu před vstupem do funkce. Použití klíčového slova 'my'
v tomto případě namísto 'local'
by vypsalo třikrát po sobě 1, protože by se proměnná $a
omezila na statickou oblast platnosti funkce f() a nebyla by viditelná ve funkci g().
Ruby
Programovací jazyk Ruby byl inspirován mimo jiné jazykem Perl, ale v jeho případě bylo značení zjednodušeno: jméno globální proměnné musí předcházet znakem $ (například $moje_promenna
), zatímco lokální proměnná se zapisuje jednoduše bez $ (například moje_promenna
). Za zmínku stojí, že Ruby poskytuje v základu podporu pouze pro lokální proměnné s lexikální oblastí platnosti, které odpovídá klíčovému slovu my
v Perlu. Existují ale knihovny pro Ruby, které doplňují možnost využívat lokální proměnné s dynamickou oblastí platnosti.