Skip to content

Variables y nombres

josuemontano edited this page Nov 20, 2014 · 3 revisions

Variables y nombres

Los nombres son las variables de Python. Decimos que un nombre es una referencia a un valor.

x = 23

Ahora el nombre x hace referencia al valor 23. Cuando utilicemos el nombre x obtendremos 23.

print(x)
x + 5

¿Un valor debe tener solo un nombre? No, puede tantos nombres como se desee.

x = 23
y = x
print(x)
print(y)

Tanto x como y hacen referencia al mismo valor, ninguno tiene prioridad sobre el otro, ambos hacen referencia al mismo valor de la misma forma. Es como poner una etiqueta llamada x y otra llamada y al valor 23.

Lección: Muchos nombres pueden referirse a un solo valor. La asignación no copia el valor asignado.


Si dos nombres hacen referencia al mismo valor, los nombres no están enlazados de forma alguna. Si se reasigna uno el otro no se cambiará.

x = 5
y = x
print(x, y)

x = 28
print(x, y)

Por tanto y = x no significa que x durante todo el programa sea igual a y, cambiará si se reasigna alguna de las variables.

Lección: Los nombres se reasignan independientemente de otros nombres.


¿Se puede reasignar un nombre a un valor cuyo tipo de dato sea distinto al primero? Sí. Python es un lenguaje dinámicamente tipado, lo que significa que los nombres no tienen tipo, los valores sí.

x = 3.14
x = "Gamma"

Una variable cualquiera puede referirse primero a un entero, luego a una cadena, a un flotante, etc. Sin embargo, con fines de claridad del código, DEBE EVITARSE utilizar así los nombres.

Lección: Los nombres no tienen tipo, los valores sí.


Supongamos que creamos una lista y le damos dos nombres

a = [1, 2, 3, 4]
b = a

Entonces, modificamos un valor de la lista a través del nombre b, si imprimimos a veremos la lista actualizada.

b[0] = -4
print(a)

Lección: Cambios en el valor son visibles a través de cualquiera de sus nombres (los números son inmutables).

Garbage collector (GC)

¿Qué hay si dejamos a un valor sin nombre?

x = 2.8
x = 1.5

Internamente y de forma muy eficiente, Python lleva cuenta de cuántas referencias o nombres un valor tiene y automáticamente limpia de memoria los valores no referenciados. A esta forma automática de administración de memoria se llama "garbage collection"; Python tiene un "garbage collector".

Lección: Los valores “viven” mientras haya un nombre que haga referencia al mismo.

Llamadas a funciones

Uno de los casos más interesantes es la llamada a una función:

def suma(a, b):
    return a + b

suma(4, 9)

Cuando se hace una llamada a la función suma los valores que se proveen como argumentos, se asignan el nombre a al valor 4 y el nombre b a 9, tal y como se tratase de una asignación sencilla. Los valores pasados no se copian, se asignan. Cuando la funación retorna, los nombres "desaparecen". Si los valores tienen alguna referencia se preserva, de lo contrario el GC se encargará de eliminarlos.

Como se indicó previamente, es posible acceder al valor a través de cualquiera de sus nombres

def anadir_randomico(lista):
    lista.append(random())

a = [3, 4, -50, 1]
anadir_randomico(a)
print(a)

En el caso supracitado, pasamos la lista a una función, la cual modificó la lista. No se copiaron valores, por esta razón podemos acceder a la lista moificada desde el nombre a. Este comportamiento es esencial para escribir funciones que modifican objectos. Otra forma de escribir la misma función es:

def anadir_randomico(lista):
    lista = lista + [random()]

a = [3, 4, -50, 1]
anadir_randomico(a)
print(a)

¿Vió el resultado? No es el mismo. ¿Por qué? Veamos la función. La expresión lista + [random()] crea una nueva lista, a esta se le da el nombre lista. El valor pasado a la función nunca se modificó. Como los nombres no existen fuera de función en la que son declarados esta lista queda sin nombre y es reclamada por el GC.

(Información adicional: http://nedbatchelder.com/text/names.html)