Tipos y estructuras de datos
Python · Lección 1
La idea
En Python una variable no contiene un valor: apunta a un objeto. Esa sola frase explica el 80 % de los bugs que te van a morder en pandas y NumPy. Todo lo demás en esta lección es consecuencia.
Los objetos se parten en dos familias: inmutables (no se pueden modificar, solo reemplazar) y mutables (se modifican en su lugar, y todos los que apuntan a ellos ven el cambio).
| Inmutables | Mutables |
|---|---|
int, float, bool, str, tuple, frozenset |
list, dict, set, y casi todo objeto propio |
Por qué importa: el experimento
Corre esto y mira los identificadores. id() devuelve la dirección del objeto.
Ahora el mismo experimento con un inmutable:
Por qué y += 1 no toca a x
x = 10 crea el objeto 10 y hace que el nombre x apunte a él.
y = x hace que y apunte al mismo objeto. No hay copia. Hasta aquí, idéntico al caso de la lista.
y += 1 sobre un int no puede modificar el objeto — los enteros son inmutables. Python evalúa 10 + 1, obtiene un objeto 11 nuevo, y reapunta y hacia él. x sigue apuntando al 10 original.
En la lista, b.append(4) sí puede modificar el objeto, porque las listas son mutables. No se crea nada nuevo: a y b siguen apuntando al mismo objeto, que ahora tiene cuatro elementos.
La regla: += sobre inmutable reapunta; un método mutador sobre mutable modifica en su lugar.
== contra is
==pregunta ¿valen lo mismo?ispregunta ¿son el mismo objeto en memoria?
is
is se usa con None, True y False, y con nada más. Escribe if x is None:, nunca if x == None:. Para comparar valores, siempre ==.
Copias: superficial contra profunda
La copia superficial duplica el contenedor de afuera, pero sus elementos siguen siendo los mismos objetos. Con listas de listas, diccionarios anidados o DataFrames con objetos adentro, esto te va a morder.
Las cuatro estructuras
Costo de buscar un elemento — importa cuando la colección crece:
| Operación | list |
set / dict |
|---|---|---|
x in coleccion |
O(n) — recorre todo | O(1) — tabla hash |
| Insertar al final | O(1) | O(1) |
| Mantener orden | sí | sí (dict, desde 3.7) |
Si vas a preguntar “¿está este elemento?” muchas veces, usa set. Con 100 000 elementos la diferencia es de segundos a microsegundos.
Ejercicio 1 — Aliasing
Haz que copia sea una copia independiente de datos, de modo que agregarle un elemento no altere el original.
copia = datos no sirve: crea un alias. Necesitas una lista nueva con los mismos elementos. Hay tres formas: rebanada completa, el método .copy(), o el constructor list().
Ejercicio 2 — Elegir la estructura
De una lista de códigos de producto con repetidos, obtén los códigos únicos, ordenados de menor a mayor, como una lista.
Un set elimina duplicados pero no tiene orden. sorted() recibe cualquier iterable y siempre devuelve una lista. Puedes componer ambos en una sola expresión.
Ejercicio 3 — Conteo con diccionario
Cuenta cuántas veces aparece cada sucursal. Devuelve un dict de sucursal a conteo.
La primera vez que ves una sucursal, la clave todavía no existe y conteo[sucursal] += 1 lanza KeyError. Usa conteo.get(sucursal, 0) para obtener 0 cuando la clave falta.
Reto
En proyectos/notebooks/F0-retos.ipynb, sin mirar esta lección:
- Escribe una función que reciba una lista de listas y devuelva una copia profunda sin usar
copy.deepcopy— solo comprehensions o bucles. - Mide con
timeitcuánto tardax in listacontrax in conjuntopara 100 000 elementos, buscando un elemento que no existe (el peor caso). Anota la razón entre ambos tiempos. - Explica en una línea por qué una
tuplepuede ser clave de undictpero unalistno.
Para el Cerebro
Lee McKinney cap. 2–3 con estas tres preguntas escritas antes de empezar:
- ¿Qué diferencia hay entre
a = a + [1]ya += [1]sobre una lista? (Hay una, y es importante.) - ¿Por qué los argumentos por defecto mutables son una trampa en Python?
- ¿Qué requisito debe cumplir un objeto para ser clave de un diccionario?
Flashcards para pegar en tu nota:
¿Qué pregunta `is` y qué pregunta `==`?::`is` pregunta si son el mismo objeto en memoria; `==` si valen lo mismo
¿Cuándo se usa `is` correctamente?::Solo con None, True y False
¿Por qué `y += 1` sobre un int no afecta a `x = y`?::Los int son inmutables: crea un objeto nuevo y reapunta y
¿Qué copia una copia superficial?::Solo el contenedor externo; los elementos siguen siendo los mismos objetos
Costo de `x in lista` vs `x in set`::O(n) contra O(1)
¿Por qué una tupla puede ser clave de dict y una lista no?::La clave debe ser hashable, y el hash exige inmutabilidad
Fuentes
Lo que esta página demuestra sola. Los ejercicios de esta página corren en tu navegador: si tu código pasa el check, pasó de verdad.
Lo que viene de los libros.
- Python for Data Analysis 3E (McKinney — libro abierto), §2 Python Language Basics, IPython, and Jupyter Notebooks
- Python for Data Analysis 3E (McKinney — libro abierto), §3 Built-In Data Structures, Functions, and Files
Índices verificados el 11-09-2026 contra el índice publicado de cada libro.
→ Siguiente: Funciones, scope y argumentos