En informática , una variable local es una variable a la que se le da un alcance local . Una referencia de variable local en la función o bloque en el que se declara anula el mismo nombre de variable en el alcance más grande. En lenguajes de programación con solo dos niveles de visibilidad, las variables locales se contrastan con las variables globales . Por otro lado, muchos lenguajes derivados de ALGOL permiten cualquier número de niveles anidados de visibilidad, con variables privadas, funciones, constantes y tipos ocultos dentro de ellos, ya sea por bloques anidados o funciones anidadas . Las variables locales son fundamentales para la programación procedimental y, más generalmente, para la programación modular : las variables de alcance local se utilizan para evitar problemas con efectos secundarios que pueden ocurrir con las variables globales .
Las variables locales pueden tener un alcance léxico o dinámico , aunque el alcance léxico (estático) es mucho más común. En el alcance léxico (o ámbito léxico; también llamado alcance estático o ámbito estático), si el alcance de un nombre de variable es un bloque determinado, entonces su alcance es el texto del programa de la definición del bloque: dentro del texto de ese bloque, el nombre de la variable existe y está vinculado al valor de la variable, pero fuera del texto de ese bloque, el nombre de la variable no existe. Por el contrario, en el alcance dinámico (o ámbito dinámico), si el alcance de un nombre de variable es un bloque determinado, entonces su alcance es ese bloque y todas las funciones llamadas transitivamente por ese bloque (excepto cuando se reemplaza nuevamente por otra declaración); después de que finaliza el bloque, el nombre de la variable no existe. Algunos lenguajes, como Perl y Common Lisp , permiten al programador elegir el alcance estático o dinámico al definir o redefinir una variable. Entre los ejemplos de lenguajes que utilizan un alcance dinámico se incluyen Logo , Emacs lisp y los lenguajes de shell bash , dash y la declaración "local" del shell Korn de MirBSD ( mksh ). La mayoría de los demás lenguajes proporcionan variables locales con alcance léxico.
En la mayoría de los lenguajes, las variables locales son variables automáticas que se almacenan directamente en la pila de llamadas . Esto significa que cuando una función recursiva se llama a sí misma, las variables locales en cada instancia de la función reciben direcciones distintas . Por lo tanto, las variables de este ámbito se pueden declarar, escribir y leer sin ningún riesgo de efectos secundarios para las funciones fuera del bloque en el que se declaran.
Los lenguajes de programación que emplean la semántica de llamada por valor proporcionan a la subrutina llamada su propia copia local de los argumentos que se le pasan. En la mayoría de los lenguajes, estos parámetros locales se tratan de la misma manera que otras variables locales dentro de la subrutina. Por el contrario, la semántica de llamada por referencia y llamada por nombre permite que los parámetros actúen como alias de los valores que se pasan como argumentos, lo que permite que la subrutina modifique variables fuera de su propio ámbito.
En muchos lenguajes comunes (incluidos C / C++ , Visual Basic , VB.NET y PHP ) hay disponible un tipo especial de variable local, denominada variable local estática, que permite conservar un valor de una llamada de la función a otra: es una variable estática con alcance local. En este caso, las llamadas recursivas a la función también tienen acceso a la variable (única, asignada estáticamente ). En todos los lenguajes anteriores, las variables estáticas se declaran como tales con una palabra clave de clase de almacenamiento especial (por ejemplo, ).static
Las variables locales estáticas en funciones globales tienen la misma duración de vida que las variables globales estáticas , porque su valor permanece en la memoria durante la vida del programa, [1] pero tienen alcance de función (no alcance global), como con las variables locales automáticas.
Esto es distinto de otros usos de la static
palabra clave , que tiene varios significados diferentes en varios idiomas.
Perl admite variables locales tanto dinámicas como de alcance léxico. La palabra clave local
se utiliza para definir variables locales de alcance dinámico, mientras que my
se utiliza para variables locales de alcance léxico. Dado que el alcance dinámico es menos común hoy en día, la documentación de Perl advierte que " local
no es lo que la mayoría de la gente considera "local".". [2] En cambio, la local
palabra clave proporciona un valor temporal de alcance dinámico a una variable global (paquete), que dura hasta el final del bloque que la contiene. Sin embargo, la variable es visible para cualquier función llamada desde dentro del bloque. [3] Para crear variables locales de alcance léxico, utilice el my
operador en su lugar. [4]
Para entender cómo funciona considere el siguiente código:
$a = 1 ; sub f () { local $a ; $a = 2 ; g (); } sub g () { imprimir "$a\n" ; } g (); f (); g ();
Esto generará:
121
Esto sucede porque la variable global $a se modifica a un nuevo significado temporal (local) dentro de f()
, pero el valor global se restaura al salir del alcance de f()
.
my
En este caso, el uso de en lugar de local
habría impreso 1 tres veces, ya que en ese caso la $a
variable estaría limitada al ámbito estático de la función f()
y no sería vista por g()
.
Randal L. Schwartz y Tom Phoenix sostienen que el operador local
debería haber tenido un nombre diferente como save
. [5]
Ruby como lenguaje también se inspiró en Perl, pero en este caso, la notación se hizo más simple: un nombre de variable global debe estar precedido por un signo $, como $variable_name
, mientras que una variable local simplemente no tiene un signo $ delante de su nombre, como variable_name
(mientras que en Perl todos los valores escalares tienen un $ delante). Tenga en cuenta que Ruby solo proporciona soporte integrado para variables locales de ámbito estático como Perl my
, no variables locales de ámbito dinámico como Perl local
. Hay al menos una biblioteca para Ruby que proporciona variables de ámbito dinámico. [6]