Dónde viven los valores y a qué apuntan los nombres: memoria y referencias
Mientras un programa corre, cada valor que hacemos tiene que vivir en algún sitio. Ese sitio es la memoria. Imagina una larga pared de casilleros numerados. Un nombre es una nota que apunta a uno de esos casilleros.
Cada valor vive en algún sitio
Durante todo el tiempo que un programa corre,
cada valor ocupa un sitio en algún lugar de la memoria.
La memoria es como una pared con casilleros numerados.
Haz un valor y se mete en una casilla vacía.
El programa recuerda un valor por 'qué número de casilla'.
Pulsa 'guardar un valor'. Entra en una casilla vacía y ves el número de casilla.
Cada valor tiene su casilla y su número.
Pero en el código no escribimos 'casilla 7', ¿verdad?
Escribimos nombres como 'a', 'puntuación'.
¿Cómo se conecta ese nombre con un número de casilla?
Un nombre apunta a una casilla
Un nombre no es el valor en sí.
Es una nota que sabe 'qué casilla'.
Nombre 'a' -> casilla 3 -> el 7 de dentro.
Así que al usar 'a', el programa sigue la nota,
abre la casilla 3 y lee 7. Esto es 'apuntar'.
Toca el nombre 'a'. Sigue la nota hasta la casilla y saca el valor.
El nombre apunta a una casilla, y el valor está dentro de esa casilla.
Esta 'nota que apunta' se llama referencia.
Ahora, de aquí en adelante es lo que de verdad importa.
Si dices 'dale a a b también', ¿qué pasa?
Un valor pequeño se copia
Da un valor pequeño como un número a b,
y ese valor se duplica en una casilla nueva.
Ahora a es la casilla 3, b es la 5. Casillas distintas.
Así que aunque cambies a a 9, b sigue siendo 7.
Los dos son independientes, cada uno con su propio valor.
Pulsa 'copiar a b' y luego 'cambiar a'. b es otra casilla, así que no cambia.
Los valores pequeños copiados no se afectan. Limpio.
Pero una cosa grande como un objeto es otra historia.
Duplicar una cosa grande entera es pesado.
Así que, a menudo, en vez de copiar, ocurre otra cosa.
Las cosas grandes comparten una casilla
Al dar un objeto a b, en vez de duplicar el objeto entero,
a menudo se hace que b apunte a la misma casilla.
Ahora a y b, dos notas, apuntan juntas a una casilla.
Así que si cambias ese objeto a través de a,
mirar por b muestra el mismo cambio. Una cosa con dos nombres.
Dos nombres apuntando a una casilla: cambiar uno cambia ambos.
Es lo que más sorprende al aprender por primera vez.
'¿Por qué cambió b si nunca lo toqué?'
Ahora sabes la respuesta: apuntaban a la misma casilla.
Sabe qué apunta a dónde y se acaba la confusión
La confusión siempre se reduce a una cosa.
¿El nombre tiene su propia copia, o comparte un puntero a una cosa?
Valor pequeño: es copia, así que se separan.
Cosa grande: apuntan a una casilla, así que se mueven juntos.
Solo recuerda esta distinción y las sorpresas desaparecen.
Elige 'valor pequeño' o 'cosa grande' y haz lo mismo. Mira cómo se separan los resultados.
Hasta aquí, esta es la base de la programación.
Desde un solo valor, agrupamos, repetimos y nombramos,
reunimos en objetos, arreglamos depurando, y dejamos que una máquina lo ejecute.
Y ahora hemos visto dónde vive todo eso
y a qué apuntan los nombres. Ya tienes una base sólida.