Al usar Python, te darás cuenta de que utilizas my_list.pop() para eliminar el último elemento de una lista y my_dict.pop('key') para eliminar un elemento de un diccionario, entre otros objetos, usando .pop().
Parece que el pop() es un método de instancia universal que se puede adjuntar a cualquier objeto. ¿Cuál es la naturaleza del método pop()?
1. 'pop()' no es uno solo
Para ser directos, el pop() de list y el pop() de dict son métodos completamente diferentes aunque tengan el mismo nombre.
-
La clase
listdefine su propio métodopop()específicamente para listas. -
La clase
dicttambién define su propio métodopop()para diccionarios. -
Lo mismo ocurre con la clase
set.
Que diferentes objetos tengan métodos con el mismo nombre está íntimamente relacionado con una de las características de la programación orientada a objetos en Python, que es el polimorfismo. El nombre 'pop' comparte solo un significado convencional: "extraer (pop) y devolver un elemento de una estructura de datos".
2. Diferentes formas de funcionar de pop() según la clase
El hecho de que tengan el mismo nombre no significa que funcionen de la misma manera. Cada clase ha implementado pop() de acuerdo a su estructura de datos.
1. list.pop([index])
-
Funcionamiento: Elimina y devuelve el elemento en un índice específico (index) de la lista.
-
Características: Si no se especifica un índice, se aplica por defecto
-1para eliminar el último elemento. Esto es idéntico a la operación 'pop' de una estructura de datos de pila (Stack). -
Ejemplo:
my_list = ['a', 'b', 'c']
# Sin especificar índice (elimina el último elemento 'c')
last_item = my_list.pop()
print(f"Valor devuelto: {last_item}, lista restante: {my_list}")
# Salida: Valor devuelto: c, lista restante: ['a', 'b']
# Especificando índice 0 ('a' es eliminado)
first_item = my_list.pop(0)
print(f"Valor devuelto: {first_item}, lista restante: {my_list}")
# Salida: Valor devuelto: a, lista restante: ['b']
2. dict.pop(key[, default])
-
Funcionamiento: Elimina y devuelve el valor asociado a una clave específica (key) en el diccionario.
-
Características: A diferencia de
list.pop(), hay que pasar una clave (key) obligatoriamente, no un índice. Si la clave no existe y se proporciona un valordefault, devuelve ese valor; si no se proporciona valordefault, se genera unKeyError. -
Ejemplo:
my_dict = {'apple': 1, 'banana': 2}
# Elimina la clave 'apple'
item = my_dict.pop('apple')
print(f"Valor devuelto: {item}, diccionario restante: {my_dict}")
# Salida: Valor devuelto: 1, diccionario restante: {'banana': 2}
# Intentando con una clave inexistente ('grape') (devolviendo valor default 99)
default_item = my_dict.pop('grape', 99)
print(f"Valor devuelto: {default_item}, diccionario restante: {my_dict}")
# Salida: Valor devuelto: 99, diccionario restante: {'banana': 2}
3. set.pop()
-
Funcionamiento: Elimina y devuelve un elemento arbitrario de un conjunto (set).
-
Características: Dado que el conjunto es una estructura de datos desordenada, no se puede predecir cuál será el elemento eliminado. No se pasa ningún argumento a
pop(). -
Ejemplo:
my_set = {10, 20, 30}
# Eliminar un elemento arbitrario (no sabes qué valor obtendrás)
item = my_set.pop()
print(f"Valor devuelto: {item}, conjunto restante: {my_set}")
# Salida posible 1: Valor devuelto: 10, conjunto restante: {20, 30}
# Salida posible 2: Valor devuelto: 20, conjunto restante: {10, 30}
3. Razones por las que parece que "se puede aplicar en cualquier lugar"
Al usar pop(), es exacto decir que parece un "método de instancia". En realidad, pop() es un método que pertenece a cada objeto (instancia).
El hecho de que parezca obj.pop() no significa que pop() sea una función global o que esté definida en la clase padre de todos los objetos. En Python, cuando llamas a obj.method(), verifica dinámicamente si el objeto obj tiene un atributo (método) llamado method.
-
my_listes una instancia de la claselist, y la claselisttiene definidopop. -
my_dictes una instancia de la clasedict, y la clasedicttambién tiene definidopop.
Por lo tanto, tanto my_list.pop() como my_dict.pop() funcionan.
¿Qué pasa si intentas llamar a pop() en un objeto que no tiene definido ese método? Como era de esperar, ocurrirá un AttributeError. Veamos un ejemplo usando una tupla.
# Una tupla (tuple) no puede cambiar sus elementos, así que no tiene el método pop().
my_tuple = (1, 2, 3)
# AttributeError: 'tuple' object has no attribute 'pop'
my_tuple.pop()

Resumen
-
pop()no es una función global en Python ni un método común. -
list,dict,set, etc. son métodos definidos de forma independiente por cada clase contenedora. -
El motivo por el que tienen el mismo nombre es que comparten el significado convencional de "extraer y devolver datos".
-
La forma de funcionamiento varía entre clases, por lo que
listutiliza un índice,dictusa una clave ysetelimina elementos arbitrariamente.
No hay comentarios.