Tuplas como objetos inmutables



@eduardo_gpg

Número de visitas 1524

Tiempo de lectura 2 min

22 Septiembre 2021

Sin duda alguna, en algún momento como desarrollador Python, probable hayas escuchado (o inclusive que tú mismo lo hayas dicho) que las tuplas en Python son objetos inmutables. Que una vez definido el objeto este no se puede modificar. 😎

Si bien esto tiene algo de cierto, no lo es del todo, principalmente en las referencias que la tupla almacena.

Verás, las tuplas son perfectas en todo aquellos escenarios donde deseamos que los valores almacenados sean constantes y no puedan ser modificados, únicamente consultados.

Algo muy común por ejemplo es el uso de tuplas en archivos de configuración. Ya que en la mayoría de los casos no deseemos que las configuraciones iniciales se modifiquen en tiempo de ejecución.

settings = (
    'localhost',
    27017,
    True
)

Una vez creamos la tupla, el objeto solo nos servirá para lectura, no para escritura.

>>> settings [0]
'localhost'

>>> settings [1]
27017

>>> settings [2]
True

Si intentamos acceder a un índice inexistente obtendremos un error.

>>>settings[10]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-30-7d0fa13ccf1f> in <module>
----> 1 settings[10]

IndexError: tuple index out of range

De igual forma, si intentamos modificar o eliminar la referencia de una objeto obtendremos un error.

>>> settings[0] = '127.0.0.1'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-33-d871665019c7> in <module>
----> 1 settings[0] = '127.0.0.1'

TypeError: 'tuple' object does not support item assignment

El uso de tuplas tiene muchas ventajas, la principal recae en la velocidad de lectura, al ser objetos inmutables el espacio en memoria reservado ya se encuentra definido, y al no poder modificarse las referencias, la lectura del objeto es mucho más rápido que si lo comparamos con una lista,

En mi ejemplo anterior almacenamos en la tupla objetos inmutables (un string, un número entero y la constante True). Sin embargo, ¿Qué pasa si almacenamos dentro de la tupla la referencia de un objeto de tipo lista, objeto que puede incrementar o decrecer su longitud en tiempo de ejecución? 😱

settings = (
    'localhost',
    [27017, 8000, 3000],
    True,
)

Al nosotros almacenar objetos mutables dentro de las tuplas ocurre algo peculiar. Si bien no podemos modificar la referencias de los objetos en la tupla, si podemos modificar los objetos per se.

Veamos un ejemplo.

>>> listado_puertos = settings[1]
>>> listado_puertos.append(5000)

>>> settings 
('localhost', [27017, 8000, 3000, 5000], True)

Tal y como podemos observar ahora el listado a incrementado su valor.

La inmutabilidad de las tuplas solo aplica a la referencias que contiene, no a los objetos referenciasdos. Por lo cual te aconsejo, siempre que puedas, intentes almacenar únicamente objetos inmutables, pudiendo así mejorando la seguridad de la tupla.

Objetos mutables dentro de la tuplas tarde o temprano causarán algún tipo de problema en nuestros programas. Evitemos hacer uso de ellos.

Creación de tuplas

Una función que me ha funcionado (vaya) bastante bien para poder crear tuplas de forma segura, es la siguiente.

def create_tuple(*args):
    try:
        [hash(item) for item in args]
        return tuple(args)
    except TypeError:
        return None
>>> create_tuple('localhost', 27017, True)
('localhost', 27017, True)
>>> create_tuple('localhost', [2017, 8000, 3000], True)
None

Te la comparto. Puedes modificarla como desees. 🐍

Lo interesante aquí es observar que la función hash no puede generar el hash a partir de objetos mutables como las listas.


¿El contenido te resulto de ayuda?

Para poder dejar tu opinión es necesario ser un usuario autenticado. Login

Más Tips y Ejercicios 🐍

Adquiere una subscripción PyWombat por tan solo $3 USD. al mes.

Conoce los beneficios de ser usuario premium:
Niveles desbloqueados: Ten accesos a todos los niveles de ejercicios. 🔓
Nuevo límite: Incrementa tu límite de ejercicios por semana. 🚀
Contenido único: Recibe semanalmente recursos exclusivos de Python (Videos, Artículos y Capitulos del libro PyWombat, comienza como desarrollador Python. 🐍