Локальная переменная
В информатике локальная переменная — это переменная , имеющая локальную область видимости . Ссылка на локальную переменную в функции или блоке , в котором она объявлена, переопределяет то же имя переменной в более широкой области. В языках программирования, имеющих только два уровня видимости, локальные переменные противопоставляются глобальным переменным . С другой стороны, многие языки, производные от ALGOL, допускают любое количество вложенных уровней видимости, при этом частные переменные, функции, константы и типы скрыты внутри них либо с помощью вложенных блоков, либо вложенных функций . Локальные переменные имеют основополагающее значение для процедурного программирования и, в более общем смысле, модульного программирования : переменные локальной области используются, чтобы избежать проблем с побочными эффектами , которые могут возникнуть с глобальными переменными .
Объем
[ редактировать ]Локальные переменные могут иметь лексическую или динамическую область видимости , хотя лексическая (статическая) область видимости встречается гораздо чаще. При лексической области видимости (или лексической области видимости; также называемой статической областью видимости или статической областью видимости), если областью действия имени переменной является определенный блок, то ее областью действия является текст программы определения блока: внутри текста этого блока существует имя переменной и привязано к значению переменной, но вне текста этого блока имя переменной не существует. Напротив, при динамической области видимости (или динамической области видимости), если областью действия имени переменной является определенный блок, то ее областью действия является этот блок и все функции, транзитивно вызываемые этим блоком (за исключением случаев, когда они снова переопределяются другим объявлением); после завершения блока имя переменной не существует. Некоторые языки, такие как Perl и Common Lisp , позволяют программисту выбирать статическую или динамическую область видимости при определении или переопределении переменной. Примеры языков, использующих динамическую область видимости, включают Logo , Emacs lisp , а также языки оболочки bash , Dash и оболочку MirBSD Korn ( mksh ) «локальное» объявление. Большинство других языков предоставляют локальные переменные с лексической областью действия.
В большинстве языков локальные переменные — это автоматические переменные, хранящиеся в стеке вызовов непосредственно . Это означает, что когда рекурсивная функция вызывает сама себя, локальным переменным в каждом экземпляре функции присваиваются разные адреса . Следовательно, переменные этой области действия можно объявлять, записывать и читать без какого-либо риска побочных эффектов для функций вне блока, в котором они объявлены.
Языки программирования, использующие семантику вызова по значению , предоставляют вызываемой подпрограмме собственную локальную копию аргументов переданных ей . В большинстве языков эти локальные параметры обрабатываются так же, как и другие локальные переменные внутри подпрограммы. Напротив, семантика вызова по ссылке и вызова по имени позволяет параметрам действовать как псевдонимы значений, передаваемых в качестве аргументов, позволяя подпрограмме изменять переменные за пределами ее собственной области действия.
Статические локальные переменные
[ редактировать ]Специальный тип локальной переменной, называемый статической локальной переменной, доступен во многих основных языках (включая C / C++ , Visual Basic , VB.NET и PHP ), который позволяет сохранять значение от одного вызова функции к другому – это — статическая переменная с локальной областью действия. В этом случае рекурсивные вызовы функции также имеют доступ к (единственной, статически выделенной ) переменной. Во всех вышеперечисленных языках статические переменные объявляются как таковые с помощью специального ключевого слова класса хранения (например, static
).
Статические локальные переменные в глобальных функциях имеют такое же время жизни, как и статические глобальные переменные , поскольку их значение остается в памяти на протяжении всего срока службы программы. [1] но имеют область действия функции (а не глобальную), как и в случае с автоматическими локальными переменными.
Это отличается от других вариантов использования static
ключевое слово , которое имеет несколько разных значений на разных языках.
Локальные переменные в Perl
[ редактировать ]Perl поддерживает как динамические, так и локальные переменные с лексической областью. Ключевое слово local
используется для определения локальных переменных с динамической областью действия, а my
используется для локальных переменных с лексической областью. Поскольку динамическая область видимости сегодня менее распространена, документация Perl предупреждает, что « local
это не то, что большинство людей считают «местным».». [2] Вместо этого local
Ключевое слово дает временное значение с динамической областью глобальной (пакетной) переменной, которая сохраняется до конца охватывающего блока. Однако переменная видна любой функции, вызываемой из блока. [3] Чтобы создать локальные переменные с лексической областью действия, используйте команду my
вместо этого оператор. [4]
Чтобы понять, как это работает, рассмотрим следующий код:
$a = 1;
sub f() {
local $a;
$a = 2;
g();
}
sub g() {
print "$a\n";
}
g();
f();
g();
это выведет:
1 2 1
Это происходит потому, что глобальная переменная $a изменяется внутри нового временного (локального) значения. f()
, но глобальное значение восстанавливается после выхода из области действия f()
.
С использованием my
в этом случае вместо local
напечатал бы 1 три раза, так как в этом случае $a
переменная будет ограничена статической областью действия функции f()
и не видел g()
.
Рэндал Л. Шварц и Том Феникс утверждают, что оператор local
должно было быть другое имя, например save
. [5]
Локальные переменные в Ruby
[ редактировать ]Ruby как язык также был вдохновлен Perl, но в данном случае обозначение было упрощено: имени глобальной переменной должен предшествовать знак $, например $variable_name
, а у локальной переменной перед именем просто нет знака $, например variable_name
(в то время как в Perl все скалярные значения имеют знак $ впереди). Обратите внимание, что Ruby предоставляет только встроенную поддержку локальных переменных со статической областью действия, таких как Perl. my
, а не локальные переменные с динамической областью действия, такие как Perl local
. Существует по крайней мере одна библиотека для Ruby, которая предоставляет переменные с динамической областью видимости.
[6]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Текущий стандарт C» (PDF) . (3,61 МБ) (по состоянию на 2009 г.) [update]). В частности, см. раздел 6.2.4 «Длительность хранения объектов», стр. 32.
- ^ perldoc.perl.org: локальный
- ^ perldoc.perl.org: perlsub: временные значения через
local()
- ^ perldoc.perl.org: perlsub: частные переменные через
my()
- ^ Рэндал Л. Шварц и Том Феникс (1 июля 2001 г.). Изучение Perl 3-го издания . О'РЕЙЛИ. пункт 4.7. ISBN 0-596-00132-0 .
- ^ Конрад Ирвин. «LSpace: динамическая область действия для Ruby». декабрь 2012 г. http://cirw.in/blog/lspace Проверено 16 октября 2013 г.