En esta lección se tratan aspectos generales de las variables.
El concepto de "variable" proviene de las Matemáticas. En Matemáticas, una variable es un símbolo que forma parte de una expresión o de una fórmula. Normalmente las variables se representan mediante letras del alfabeto latino ( x, y, z, n, i, j, etc.). Dependiendo del contexto, las variables significan cosas distintas. Por ejemplo:
Consideremos por ejemplo la ecuación:
x + 3 = 5
En este caso, la variable x representa una cantidad desconocida pero de la que se sabe que si se le suma 3 se obtiene 5. Resolviendo la ecuación, obtenemos inmediatamente que la variable x estaba representando realmente el número 2.
Consideremos por ejemplo la ecuación de la recta:
y = x + 1
En este caso, la variable x no representa ningún valor concreto, sino que puede tomar cualquier valor numérico positivo o negativo. Para cada valor de x podemos calcular el valor correspondiente de la variable y. Si interpretamos x e y como las coordenadas de puntos en un plano y dibujamos varios puntos, podríamos ver que todos los puntos se encuentran situados en una misma recta.
En Programación también existe el concepto de "variable", parecido pero no idéntico al concepto matemático.
En Programación, las variables están asociadas a variables concretos. Además, cada lenguaje de programación tiene su forma de implementar el concepto de variable, por lo que lo que se explica a continuación es válido para muchos lenguajes de programación, aunque otros lenguajes de programación permiten otras posibilidades.
a = 2
... lo que estamos pidiendo al programa es que guarde el valor 2 en una "caja" y que a la caja le llame a.
En esos lenguajes, el símbolo igualdad (=) hay que entenderlo como una asignación, no como una igualdad matemática. Al escribir una igualdad, le estamos pidiendo al programa que calcule lo que hay a la derecha de la igualdad y que lo guarde en la variable que hay a la izquierda de la igualdad.
En esos lenguajes, no estaría permitido escribir ...
2 = a
... porque 2 no es un nombre válido de variable. Tampoco estaría permitido escribir ...
x + 3 = 5
... porque en el lado izquierdo no pueden aparecer operadores.
a = 2 b = 3 c = a + b
Cada tipo de información se almacena de forma distinta, por lo que existen diferentes tipos de variables para cada tipo de información.
En algunos lenguajes de programación, las variables se pueden entender como "cajas" en las que se guardan los datos, pero en Python las variables son "etiquetas" que permiten hacer referencia a los datos (que se guardan en unas "cajas" llamadas objetos).
Python es un lenguaje de programación orientado a objetos y su modelo de datos también está basado en objetos.
Para cada dato que aparece en un programa, Python crea un objeto que lo contiene. Cada objeto tiene:
Así, las variables en Python no guardan los datos, sino que son simples nombres para poder hacer referencia a esos objetos. Si escribimos la instrucción ...
a = 2
... Python:
Así, al describir la instrucción anterior no habría que decir 'la variable a almacena el número entero 2', sino que habría que decir 'podemos llamar a al objeto número entero 2'. La variable a es como una etiqueta que nos permite hacer referencia al objeto "2", más cómoda de recordar y utilizar que el identificador del objeto.
Por otro lado, en Python se distingue entre objetos mutables y objetos inmutables:
En el caso de los objetos inmutables (como los números) no hay mucha diferencia entre considerar la variable como una caja o como una etiqueta, pero en el caso de los objetos mutables (como las listas) pensar en las variables como cajas puede llevar a error.
Por economía del lenguaje, en estos apuntes se utilizan expresiones como "guardar un valor en una variable" en vez de "guardar el valor en un objeto y asociar una variable al objeto", pero el alumno debe tener presente lo que ocurre en realidad en Python.
Más adelante en este curso, en las lecciones Variables 2 y Variables 3, se profundiza en la idea de variable de Python.
Las variables en Python se crean cuando se definen por primera vez, es decir, cuando se les asigna un valor por primera vez. Para asignar un valor a una variable se utiliza el operador de igualdad (=). A la izquierda de la igualdad se escribe el nombre de la variable y a la derecha el valor que se quiere dar a la variable.
En el ejemplo siguiente se almacena el número decimal 2.5 en una variable de nombre x (como se comenta en el apartado anterior, realmente habría que decir que se crea la etiqueta x para hacer referencia al objeto número decimal 2.5). Fíjese en que los números decimales se escriben con punto (.) y no con coma (,).
>>> x = 2.5
La variable se escribe siempre a la izquierda de la igualdad. Si se escribe al revés, Python genera un mensaje de error:
>>> 2.5 = x SyntaxError: can't assign to literal
Para que IDLE muestre el valor de una variable, basta con escribir su nombre:
>>> x = 2.5 >>> x 2.5
Si una variable no se ha definido previamente, escribir su nombre genera un mensaje de error:
>>> x = -10 >>> y Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> y NameError: name 'y' is not defined
Una variable puede almacenar números, texto o estructuras más complicadas (que se verán más adelante). Si se va a almacenar texto, el texto debe escribirse entre comillas simples (') o dobles ("), que son equivalentes. A las variables que almacenan texto se les suele llamar cadenas (de texto).
>>> nombre = "Pepito Conejo" >>> nombre 'Pepito Conejo'
Si no se escriben comillas, Python supone que estamos haciendo referencia a otra variable (que, si no está definida, genera un mensaje de error):
>>> nombre = Pepe Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> nombre = Pepe NameError: name 'Pepe' is not defined
>>> nombre = Pepito Conejo SyntaxError: invalid syntax
La instrucción del borra completamente una variable.
>>> nombre = "Pepito Conejo" >>> nombre 'Pepito Conejo' >>> del nombre >>> nombre Traceback (most recent call last): File "<pyshell#2>", line 1, in <module> nombre NameError: name 'nombre' is not defined
Aunque no es obligatorio, se recomienda que el nombre de la variable esté relacionado con la información que se almacena en ella, para que sea más fácil entender el programa. Si el programa es trivial o mientras se está escribiendo un programa, esto no parece muy importante, pero si se consulta un programa escrito por otra persona o escrito por uno mismo pero hace tiempo, resultará mucho más fácil entender el programa si los nombres están bien elegidos.
También se acostumbra a utilizar determinados nombres de variables en algunas ocasiones, como se verá más adelante, pero esto tampoco es obligatorio.
El nombre de una variable debe empezar por una letra o por un guion bajo (_) y puede seguir con más letras, números o guiones bajos.
>>> _x = 3.8 >>> _x 3.8
>>> x1 = 100 >>> x 100
>>> fecha_de_nacimiento = "27 de octubre de 1997" >>> fecha_de_nacimiento '27 de octubre de 1997'
Los nombres de variables no pueden incluir espacios en blanco.
>>> fecha de nacimiento = "27 de octubre de 1997" SyntaxError: invalid syntax
Los nombres de variables pueden contener cualquier carácter alfabético (los del alfabeto inglés, pero también ñ, ç o vocales acentuadas), aunque se recomienda utilizar únicamente los caracteres del alfabeto inglés.
>>>año = 1997
Nota: En Python 2 los nombres de variables no podían contener caracteres no ingleses.
Los nombres de las variables pueden contener mayúsculas, pero tenga en cuenta que Python distingue entre mayúsculas y minúsculas (en inglés se dice que Python es case-sensitive).
>>> nombre = "Pepito Conejo" >>> Nombre = "Numa Nigerio" >>> nomBre = "Fulanito Mengánez" >>> nombre 'Pepito Conejo' >>> Nombre 'Numa Nigerio' >>> nomBre 'Fulanito Mengánez'
Cuando el nombre de una variable contiene varias palabras, se aconseja separarlas con guiones bajos para facilitar la legibilidad, aunque también se utiliza la notación camelCase, en las que las palabras no se separan pero empiezan con mayúsculas (salvo la primera palabra).
>>> fecha_de_nacimiento = "27 de octubre de 1997" >>> fechaDeNacimiento = "27 de octubre de 1997"
Las palabras reservadas del lenguaje (las que IDLE escribe en naranja) están prohibidas como nombres de variables:
>>> lambda = 3 SyntaxError: invalid syntax
Los nombres de las funciones integradas sí que se pueden utilizar como nombres de variables, pero más vale no hacerlo porque a continuación ya no se puede utilizar la función como tal:
>>> print = 3 >>> print("Hola") Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> print("Hola") TypeError: 'int' object is not callable
Borrando con del la variable con nombre de función, se recupera la función.
>>> print = 3 >>> print("Hola") Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> print("Hola") TypeError: 'int' object is not callable >>> del print >>> print("Hola") Hola
En el apartado anterior hay definiciones de algunos de los tipos de variables que hay en Python: números decimales, números enteros y cadenas (una o más letras).
Aunque se definan de forma similar, para Python no es lo mismo un número entero, un número decimal o una cadena ya que, por ejemplo, dos números se pueden multiplicar pero dos cadenas no (curiosamente, una cadena sí que se puede multiplicar por un número).
Por tanto, estas tres definiciones de variables no son equivalentes:
>>> fecha = 1997 >>> fecha = 1997.0 >>> fecha = "1997" >>> fecha = [27, "octubre", 1997]
En el primer caso la variable fecha está almacenando un número entero, en el segundo fecha está almacenando un número decimal y en el tercero fecha está almacenando una cadena de cuatro letras. En el cuarto, fecha está almacenando una lista (un tipo de variable que puede contener varios elementos ordenados).
Este ejemplo demuestra también que se puede volver a definir una variable. Python modifica el tipo de la variable automáticamente.
Para que IDLE muestre el valor de una variable, basta con escribir su nombre.
>>> a = 2 >>> a 2
También se puede conocer el valor de varias variables a la vez escribiéndolas entre comas (IDLE las mostrará entre paréntesis porque Python las considera como un conjunto ordenado llamado tupla), como muestra el siguiente ejemplo:
>>> a = b = 2 >>> c = "pepe" >>> a 2 >>> c, b ('pepe', 2)
Una vez se ha definido una variable, se puede utilizar para hacer cálculos o para definir nuevas variables, como muestran los siguientes ejemplos:
>>> a = 2 >>> a + 3 5
>>> horas = 5 >>> minutos = 60 * horas >>> segundos = 60 * minutos >>> segundos 18000
>>> horas = 1 >>> minutos = 2 >>> segundos = 3 >>> segundos + 60 * minutos + 3600 * horas 3723
En caso de utilizar una variable no definida anteriormente, Python genera un mensaje de error.
>>> dias = 7 * semanas Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> dias = 7 * semanas NameError: name 'semanas' is not defined
Se puede redefinir una variable a partir de su propio valor. Por ejemplo
>>> a = 10 >>> a = a + 5 >>> a 15
Esto es posible porque el símbolo de igualdad significa siempre asignación. Lo que hace Python es calcular la expresión situada a la derecha de la igualdad y después guardar el resultado en la variable situada a la izquierda de la igualdad. En el ejemplo, Python coge el valor almacenado en la variable a (10), le suma 5, y el resultado (15) lo guarda en la misma variable a.
Es importante tener presente que las igualdades son siempre asignaciones, nunca ecuaciones. En el ejemplo, la expresión a = a + 5 no tendría mucho sentido como ecuación (no tendría solución), pero como asignación lo que hace es aumentar en 5 el valor de la variable a.
Es importante también tener presente que los nombres de las variables no tienen sentido real para Python, son simples etiquetas para referirse al contenido.
Por ejemplo, en el siguiente ejemplo se crean dos variables y se suman, aunque en el mundo real hay gente que opina que se pueden sumar peras y manzanas ;-):
>>> peras = 7 >>> manzanas = 22 >>> peras + manzanas 29
O el siguiente ejemplo en el que Python permite realizar cualquier operación con las variables distancia y tiempo, aunque no tengan sentido físico (de hecho, sólo la división lo tiene, es la velocidad).
>>> distancia = 100 >>> tiempo = 4 >>> distancia + tiempo 104 >>> distancia * tiempo 400 >>> distancia / tiempo 25.0
Cuando se modifica una variable, el valor anterior se pierde y no se puede recuperar (salvo si se realiza la operación contraria o hay otra variable que conserva el valor anterior).
Hay que tener cuidado al modificar una variable que se ha utilizado para definir otras variables, porque esto puede afectar al resto de variables:
Nota: Este punto se trata con más detalle en la lección Variables 2.
>>> a = 10 >>> b = a >>> a, b (10, 10) >>> a = 20 >>> a, b (20, 10)
>>> a = [10] >>> b = a >>> a, b ([10], [10]) >>> a[0] = 20 >>> a, b ([20], [20])
Cuando una variable se modifica a partir de su propio valor, se puede utilizar la denominada "asignación aumentada", una notación compacta que existe también en otros lenguajes de programación.
Por ejemplo:
>>> a = 10 >>> a += 5 >>> a 15
es equivalente a:
>>> a = 10 >>> a = a + 5 >>> a 15
En general:
Asignación aumentada: | es equivalente a: |
---|---|
a += b | a = a + b |
a -= b | a = a - b |
a *= b | a = a * b |
a /= b | a = a / b |
a **= b | a = a ** b |
a //= b | a = a // b |
a %= b | a = a % b |
Nota: Las dos notaciones son completamente equivalentes en el caso de los objetos inmutables (números, cadenas, tuplas), pero en el caso de los objetos mutables (listas, diccionarios, etc.) hay una pequeña diferencia que se comenta en la lección Variables 2
En Python no existen los operadores incremento (++) o decremento (--) que sí existen en otros lenguajes de programación:
>>> a = 5 >>> a++ SyntaxError: invalid syntax
En una misma línea se pueden definir simultáneamente varias variables, con el mismo valor o con valores distintos, como muestra el siguiente ejemplo:
>>> a = b = 99 >>> c, d, e = "Mediterráneo", 10, ["pan", "queso"]
En el primer caso las dos variables tendrán el mismo valor. En el segundo caso la primera variable tomará el primer valor y así sucesivamente.
Si el número de variables no coincide con el de valores, Python genera un mensaje de error.
>>> a, b, c = 1, 2 Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> a, b, c = 1, 2 ValueError: need more than 2 values to unpack
>>> a, b, c = 1, 2, 3, 4 Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> a, b, c = 1, 2, 3, 4 ValueError: too many values to unpack
Se pueden modificar varias variables en una sola instrucción y la modificación se realiza en un solo paso.
>>> a, b = 5, 10 >>> a, b (5, 10) >>> a, b = b, a >>> a, b (10, 5)
Obsérvese que si este procedimiento lo hubiéramos hecho paso a paso, el resultado hubiera sido distinto:
>>> a, b = 5, 10 >>> a, b (5, 10) >>> a = b >>> b = a >>> a, b (10, 10)
El motivo de este resultado se entiende fácilmente mostrando los valores tras cada operación:
>>> a, b = 5, 10 >>> a, b (5, 10) >>> a = b >>> a, b (10, 10) >>> b = a >>> a, b (10, 10)