R

ReflexKR

Documentación de Reflex

El aeropuerto de las etiquetas: el modelo de objetos de Python

·

Resumen del curso

1

La etiqueta no es la maleta: nombres y objetos

2

Maletas selladas: mutable e inmutable

3

Maletas dentro de maletas: contenedores y copias

4

Al entregar una maleta: funciones y argumentos

5

Zonas y pases: ámbitos

6

Equipaje de mano: clausuras

7

La especificación de la maleta: clases e instancias

8

Procedimientos estándar del aeropuerto: métodos dunder

9

La especificación de la especificación: herencia y MRO

10

El control: el secreto del acceso a atributos

11

Maletas sin dueño: memoria y GC

12

Números de taquilla: hash, igualdad y repaso final

El aeropuerto de las etiquetas: el modelo de objetos de Python
Lección 1

Tiempo 0:00–0:50

La etiqueta no es la maleta: nombres y objetos

Parte de equipaje perdido

LOST-001

Creía que eran dos maletas

Lo reporta

Park, agente de una agencia de viajes

Qué se perdió

La lista de recuerdos para un grupo. Hizo una «copia» de reserva de la lista, le añadió un imán y el imán apareció también en la lista original.

Para cerrar el caso

Demostrar con código que las dos listas fueron desde el principio la misma maleta, y crear una lista de reserva de verdad.

Aeropuerto Internacional Haneulseom · Centro de equipajes

Primer día de trabajo, por la mañana. La supervisora Do Miran te entrega un fajo de etiquetas delante de la cinta transportadora. «Hay una frase que tienes que aprenderte antes que nada en este centro: una maleta, muchas etiquetas.»

El primer parte viene de una agencia de viajes. Hicieron una segunda lista de recuerdos como reserva, pero todo lo que apuntan en la reserva aparece también en la lista original. La supervisora mira el código y sonríe. «¿Dos listas? Dos etiquetas, más bien.»

1-1. = cuelga una etiqueta (9 min)

Este es el código del parte:

souvenirs = ["postcard", "keyring"]
backup = souvenirs
backup.append("magnet")
print(souvenirs)
# ['postcard', 'keyring', 'magnet']

backup = souvenirs no copia la lista. Cuelga una etiqueta más, backup, de la misma maleta que ya llevaba la etiqueta souvenirs. Desde el principio solo había una maleta, y backup.append metió el imán en esa única maleta.

  • = evalúa primero el lado derecho para obtener un objeto (la maleta) y luego ata el nombre de la izquierda (la etiqueta) a ese objeto.
  • Si el lado derecho es un nombre que ya existe, no se crea ningún objeto nuevo. Ese mismo objeto simplemente gana un nombre más.

Avanza línea a línea en el tablero de etiquetas de abajo. La columna izquierda son las etiquetas y la derecha, las maletas. Antes de la línea 3 tendrás que predecir el resultado para poder seguir.

Tablero de etiquetas

Paso 1 / 0

Lo siguiente que se ejecuta: 0

Preparando el laboratorio…

Acaba de cambiar

Maleta sellada (inmutable)

Incluso después de la línea 2 sigue habiendo una sola maleta. Fíjate en que las dos flechas apuntan a la misma lista.

1-2. Las tres cosas de una maleta: identidad, tipo y valor (8 min)

Todo objeto tiene tres cosas.

Cómo se consultaEn el aeropuerto sería
Identidad (identity)id(obj), a is bEl número único grabado en la base de la maleta
Tipo (type)type(obj)La clase de maleta (trolley, mochila…)
Valor (value)Se compara con ==Lo que lleva dentro
x = ["postcard"]
y = ["postcard"]
print(x == y, x is y)
# True False
print(id(x) == id(y), id(souvenirs) == id(backup))
# False True
  • x e y son maletas distintas con exactamente el mismo contenido. == da True; is, False.
  • souvenirs y backup son la misma maleta, así que también tienen el mismo id.
  • El número de id no significa nada por sí mismo. En CPython es una dirección de memoria, pero cambia en cada ejecución. Úsalo solo para comparar.
print(type(x), type(len))
# <class 'list'> <class 'builtin_function_or_method'>

Pin dice

→ is pregunta «¿es la misma maleta?» y == pregunta «¿lleva lo mismo dentro?». Para comparar valores, usa siempre ==. Deja is para comprobar objetos que solo existen una vez, como en x is None.

1-3. Todo es una maleta (6 min)

No solo los números y las listas son objetos. Las funciones, las clases y los módulos también son objetos atados a nombres.

shout = print
shout("boarding")
# boarding
print(shout is print)
# True

def greet():
    return "hi"

print(type(greet), greet.__name__)
# <class 'function'> greet
alias = greet
del greet
print(alias())
# hi
  • def greet(): crea un objeto función y le ata el nombre greet: en el fondo es una especie de asignación.
  • Aunque del greet quite el nombre, alias sigue apuntando al mismo objeto función, así que la función sigue ahí.
  • Las clases también son objetos. Tanto type(int) como type(type) son <class 'type'>. Volveremos a esto en la lección 7.

1-4. Mover la etiqueta o cambiar la maleta (11 min)

Con un nombre solo puedes hacer dos cosas:

  1. Mover la etiqueta (reasignar): a = .... Ata el nombre a otro objeto. La maleta original no cambia.
  2. Cambiar la maleta (mutar): a.append(...), a[0] = .... El nombre sigue donde estaba y lo que cambia es el contenido de la maleta. El cambio se ve desde todos los nombres que apuntan a esa maleta.
a = [1, 2]
b = a
a = a + [3]
print(a, b, a is b)
# [1, 2, 3] [1, 2] False
a = [1, 2]
b = a
a.append(3)
print(a, b, a is b)
# [1, 2, 3] [1, 2, 3] True

a + [3] crea una lista nueva, y a = mueve la etiqueta a a esa lista nueva. b se queda en la maleta original. En cambio, append modifica la propia maleta, así que el cambio también se ve desde b. Ejecuta abajo las dos versiones, alternando entre una y otra.

Tablero de etiquetas

Paso 1 / 0

Lo siguiente que se ejecuta: 0

Preparando el laboratorio…

Acaba de cambiar

Maleta sellada (inmutable)

Con a = a + [3], después de la línea 3 la flecha a se muda a una maleta nueva; con a.append(3), la flecha no se mueve y solo cambia lo que hay dentro de la maleta.
  • En el dibujo de la lista, el 1 y el 2 de las casillas son valores pequeños, así que se escriben como valores en lugar de flechas. En realidad también son objetos, y la lista guarda referencias a ellos (lección 3).
  • ¿Y a += [3], a cuál de los dos se parece? Con listas, cambia la maleta. Pero con números o cadenas, mueve la etiqueta. Esas dos caras son el tema de la lección 2.

1-5. del quita la etiqueta, no la maleta (6 min)

c = ["tag"]
d = c
del c
print(d)
# ['tag']
print(c)
# NameError: name 'c' is not defined

del c solo elimina el nombre c; no borra la lista. Como d todavía apunta a ella, la maleta sigue ahí. Una maleta desaparece de verdad cuando ninguna etiqueta apunta ya a ella (lección 11).

Intercambiar dos nombres con p, q = q, p también es mover etiquetas. Primero se construye una tupla con el lado derecho, q, p, y luego los nombres de la izquierda se atan, por orden, a los objetos que contiene.

p, q = "left", "right"
p, q = q, p
print(p, q)
# right left

Caso cerrado (10 min)

Aquí está la prueba de que las dos listas del parte eran la misma maleta, y la forma de crear una lista de reserva de verdad.

souvenirs = ["postcard", "keyring"]
backup = souvenirs
backup.append("magnet")
print(souvenirs is backup, id(souvenirs) == id(backup))
# True True

safe = list(souvenirs)     # crea una maleta nueva con el mismo contenido
safe.append("mug")
print(souvenirs, safe, safe is souvenirs)
# ['postcard', 'keyring', 'magnet'] ['postcard', 'keyring', 'magnet', 'mug'] False

list(souvenirs) crea una lista nueva. Ahora puedes meter una taza en safe y la lista original no cambia. (Que esta copia solo cree de nuevo «un nivel» es algo que veremos en la lección 3.)

Al final de la jornada, Pin señala hacia la cinta 13. Hay un aviso: dos maletas sin ninguna etiqueta siguen dando vueltas. La supervisora se limita a decir «si no tienen etiquetas, ya deberían haberlas retirado» y apaga la pantalla.

Informe de cierre — LOST-001. La lista siempre fue una sola; lo que había eran dos etiquetas. Comprobado con is e id; resuelto creando una lista nueva con list().

Ejercicios

  1. Si ejecutas en orden x = [0], y = x y x = [1], ¿qué vale y? Dibuja primero el esquema y luego ejecútalo para comprobarlo.
  2. Con a = [1, 2], crea b = a[:] y c = a, y predice el resultado de a is b, a is c y a == b.
  3. ¿Qué pasa si le pones otro nombre a print y luego haces del print? En la lección 5 verás dónde viven los nombres integrados.

La libreta de la supervisora

  • Una variable no es una caja, es una etiqueta. = ata el nombre de la izquierda al objeto de la derecha.

  • Las tres cosas de un objeto: identidad (id, is), tipo (type) y valor (==).

  • is mira si es el mismo objeto; == mira si el valor es igual. Para comparar valores, siempre ==.

  • Funciones, clases y módulos también son objetos. def también es una asignación que ata un nombre.

  • Reasignar (a = …) mueve el nombre; mutar (a.append …) cambia el objeto.

  • del solo quita el nombre; el objeto desaparece cuando ya nadie apunta a él.

← Anterior

Resumen del curso

Siguiente →

Lección 2 · Maletas selladas: mutable e inmutable

Recibe avisos de nuevas lecciones

Te avisaremos por correo cuando este curso tenga lecciones nuevas o se abra un curso de continuación.

Datos: tu correo electrónico · Finalidad: avisos de nuevas lecciones o de la publicación de este curso · Conservación: hasta que pidas que lo borremos. No lo usamos para nada más ni lo compartimos. Responde a cualquier aviso y lo borraremos enseguida.

Preguntas y respuestas

Pregunta lo que quieras sobre esta lección. Aquí se reúnen las preguntas de todas las versiones de idioma de esta página.

Se muestra como texto plano, sin enlaces ni formato.

R

ReflexKR

Aprende Python y Reflex haciendo. Todos los ejemplos se ejecutaron y verificaron en Reflex 0.10.0.

ReflexKR es gratis y sin banners publicitarios. Si te ayudó, puedes apoyarlo con un café. ☕ Invítanos un café

Aviso de afiliados
한국어English日本語简体中文EspañolDeutsch

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex