Tipos y estructuras de datos

Python · Lección 1

L2 Derivación Fase F0 Libro McKinney cap. 2–3 Prereqs ninguno

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) 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?
  • is pregunta ¿son el mismo objeto en memoria?
WarningEl único uso correcto de 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í (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:

  1. Escribe una función que reciba una lista de listas y devuelva una copia profunda sin usar copy.deepcopy — solo comprehensions o bucles.
  2. Mide con timeit cuánto tarda x in lista contra x in conjunto para 100 000 elementos, buscando un elemento que no existe (el peor caso). Anota la razón entre ambos tiempos.
  3. Explica en una línea por qué una tuple puede ser clave de un dict pero una list no.

Para el Cerebro

Lee McKinney cap. 2–3 con estas tres preguntas escritas antes de empezar:

  1. ¿Qué diferencia hay entre a = a + [1] y a += [1] sobre una lista? (Hay una, y es importante.)
  2. ¿Por qué los argumentos por defecto mutables son una trampa en Python?
  3. ¿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.

Índices verificados el 11-09-2026 contra el índice publicado de cada libro.

→ Siguiente: Funciones, scope y argumentos