python-tipos-valor-referencia

Tipos valor y tipos referencia en Python

En Python, los tipos de datos pueden ser divididos en dos categorías principales: tipos de valor y tipos de referencia

Esto es algo común en muchos lenguajes de programación. Entender las diferencias entre ambas es muy importante (o podéis meter la pata elegantemente en algún momento 😉).

Tipos valor

Los tipos valor en Python son aquellos cuyas variables almacenan directamente el valor real. Esto significa que cuando asignamos una variable a otro valor, se crea una nueva copia de ese valor en la memoria.

Los tipos de valor más comunes en Python son los tipos básicos como enteros, flotantes, cadenas y booleanos.

Por ejemplo,

# Asignación de un entero a una variable
x = 10

# Se crea una nueva copia del valor 10 en la memoria para la variable x
y = x

# Ahora x e y tienen valores independientes en la memoria

Cuando modificamos x o y, cada variable tiene su propio espacio en la memoria para almacenar su valor.

Tipos referencia

Los tipos referencia son aquellos cuyas variables almacenan una referencia (normalmente la dirección de memoria) al objeto real en lugar del valor real en sí mismo.

Esto significa que cuando asignamos una variable a otra, ambas variables apuntan al mismo objeto en la memoria.

Los tipos de referencia comunes incluyen listas, diccionarios, conjuntos y objetos personalizados.

Vamos a verlo con un ejemplo.

# Asignación de una lista a una variable
lista1 = [1, 2, 3]

# lista2 apunta al mismo objeto en la memoria que lista1
lista2 = lista1

# Modificar lista2 también modifica lista1
lista2.append(4)
print("lista1:", lista1)  # Resultado: [1, 2, 3, 4]

En este ejemplo, cuando modificamos lista2, también se modifica lista1 porque ambas variables apuntan al mismo objeto en la memoria.

Pasando argumentos a funciones

Cuando pasamos variables a funciones, debemos tener en cuenta si son tipos de valor o tipos de referencia.

Los tipos valor no se modifican cuando son pasados como parámetros, porque la función recibe una copia.

def duplicar_numero(num):
    num *= 2
    print("Dentro de la función:", num)

x = 10
duplicar_numero(x)
print("Fuera de la función:", x)  # x sigue siendo 10, no se modificó

El valor de x no se modifica fuera de la función duplicar_numero porque es un tipo de valor.

Los tipos referencia sí se modifican cuando son pasados como parámetros, porque la función recibe una copia de la referencia, que apunta a los mismos datos.

def modificar_lista(lista):
    lista.append("Nuevo elemento")
    print("Dentro de la función:", lista)

mi_lista = [1, 2, 3]
modificar_lista(mi_lista)
print("Fuera de la función:", mi_lista)  # mi_lista se modifica

En este caso, mi_lista se modifica fuera de la función porque es un tipo de referencia.