Paso por Valor vs Paso por Referencia
Comparativa del comportamiento de parámetros en C, JavaScript, Python y Java.
SLIDE 1 / 6
1. ¿Cómo se pasan los datos a una función?
Al invocar una función, los argumentos pueden pasarse por copia del valor o compartiendo la referencia directa a la celda de memoria original.
Paso por Valor: La función recibe una copia independiente. Modificar el parámetro NO altera la variable original.
Paso por Referencia: La función recibe un alias a la variable del llamador. Cualquier cambio altera directamente el valor original.
ESQUEMA DE MEMORIA EN PILA (STACK)
Stack Frame: main()
x = 100x7FF01
⬇️ Copia de valor
Stack Frame: update(val)
val = 10Copia independiente
2. C: Paso por Valor Estricto y Punteros
En C TODO es paso por valor. Para modificar una variable externa, pasamos la dirección de memoria (puntero `&var`) por valor.
- swap(int a, int b): Intercambia copias locales, sin efecto en main.
- swap(int *a, int *b): Desreferencia direcciones para modificar la memoria del llamador.
pointers.c
void swap(int *a, int *b) {
int temp = *a;
*a = *b; // Modifica memoria original
*b = temp;
}
int main() {
int x = 5, y = 10;
swap(&x, &y); // x=10, y=5
} 3. Java: Siempre por Valor (Primitivos vs Referencias)
Java es SIEMPRE paso por valor. En primitivos copia el valor. En objetos copia el handle de referencia.
Mutar atributos: Afecta al objeto en el Heap.
Reasignar referencia: Solo cambia la copia local del puntero, no el objeto original.
PassTest.java
public static void modify(Dog d) {
d.setName("Rex"); // Mutación en Heap
d = new Dog("Fido"); // No afecta al caller
} 4. JavaScript: Paso por Valor de Referencias
Los primitivos en JS son inmutables y se pasan por valor. Los objetos y arreglos se pasan por valor de referencia.
- obj.prop = val: Muta el objeto real.
- obj = {}: Reasigna solo la variable local de la función.
app.js
function update(user) {
user.age = 30; // Objeto original actualizado
user = { age: 99 }; // Sin efecto fuera
}
const u = { age: 20 };
update(u); // u.age es 30 5. Python: Paso por Asignación (Pass-by-Object-Reference)
En Python los argumentos se pasan por asignación. La función vincula un nombre local al objeto recibido.
list.append(): Mutación in-place en Heap.
lst = lst + [x]: Crea un nuevo objeto y re-vincula el nombre local.
script.py
def process(lst):
lst.append(100) # Mutación real
lst = [1, 2] # Re-binding local
data = [1]
process(data) # data es [1, 100] 6. Simulador Interactivo de Pila (Stack Frame)
Probá cómo se comporta el pasaje en cada lenguaje:
C: swap(&a, &b) Execution Trace
Paso 1: main() crea `a=5` (0x10) y `b=10` (0x14). Pasa direcciones `&a` y `&b`.
[main frame: a=5, b=10] -> [swap frame: *a=>0x10, *b=>0x14]
Resultado en el caller: a=10, b=5 (Mutación Exitosa)
Navegación: Flechas Izq / Der