Paso por valor y por referencia
1. Qué es el paso de parámetros? #
Cuando llamas a una función en Python, puedes pasarle datos (argumentos) para que la función trabaje con ellos. La forma en que esos datos se pasan a la función puede ser por valor o por referencia.
2. Paso de parámetros por valor #
En el paso por valor, se pasa una copia del valor del argumento a la función. Esto significa que cualquier cambio que se haga al parámetro dentro de la función no afectará al valor original fuera de la función.
Ejemplo de paso por valor #
Aunque Python no tiene paso por valor de manera estricta como otros lenguajes, cuando trabajas con tipos inmutables (como números, cadenas de texto, y tuplas), el comportamiento es similar al paso por valor.
1def duplicar_numero(numero): 2 numero = numero * 2 3 print(f"Valor dentro de la función: {numero}") 4 5# Variable original 6x = 5 7duplicar_numero(x) 8print(f"Valor fuera de la función: {x}")Salida de consola Valor dentro de la función: 10 Valor fuera de la función: 5
- ¿Qué hace este código?:
- Define la función
duplicar_numero(numero), que intenta duplicar el valor del número pasado. - Se pasa el valor
5a la función, pero fuera de la función, el valor originalxno cambia.
- Define la función
3. Paso de parámetros por referencia #
En el paso por referencia, se pasa la referencia (es decir, la dirección de memoria) del argumento a la función. Esto significa que si se modifica el parámetro dentro de la función, el valor original sí se verá afectado fuera de la función.
Ejemplo de paso por referencia #
En Python, cuando pasas tipos mutables (como listas, diccionarios, o conjuntos), se utiliza el paso por referencia.
1def agregar_elemento(lista): 2 lista.append(4) 3 print(f"Lista dentro de la función: {lista}") 4 5# Lista original 6mi_lista = [1, 2, 3] 7agregar_elemento(mi_lista) 8print(f"Lista fuera de la función: {mi_lista}")Salida de consola Lista dentro de la función: [1, 2, 3, 4] Lista fuera de la función: [1, 2, 3, 4]
- ¿Qué hace este código?:
- Define la función
agregar_elemento(lista), que agrega el número4a la lista pasada como argumento. - La lista original
mi_listaes modificada dentro de la función, y el cambio persiste fuera de la función.
- Define la función
4. Cómo funciona en Python? #
En Python:
- Los tipos inmutables (números, cadenas, tuplas) se comportan como si se pasaran por valor porque no pueden ser modificados.
- Los tipos mutables (listas, diccionarios, conjuntos) se pasan por referencia porque pueden ser modificados.
Resumen del tema
Conceptos clave #
- Mecanismo de Paso por Asignación de Objeto (Pass-by-Object-Reference): todos los argumentos se pasan como referencias a objetos en memoria.
- Objetos Inmutables (
int,float,str,tuple): cualquier reasignación dentro de la función enlaza la variable local a un nuevo objeto sin alterar la variable exterior. - Objetos Mutables (
list,dict,set): las mutaciones in-place (.append(),.pop(), modificación de claves) se reflejan inmediatamente en el objeto original fuera de la función. - Protección contra Mutaciones: pasar copias explícitas (
lista.copy(),lista[:]ocopy.deepcopy()) cuando se deba garantizar la inmutabilidad de la estructura recibida.
Qué debes recordar #
Python pasa objetos por asignación de referencia: modificar objetos mutables dentro de una función altera la variable original exterior.
Laboratorio: copiar no siempre significa independizar #
Compara un alias, una copia superficial y una copia profunda de una lista
anidada. El modelo conserva el grafo de referencias local sin ejecutar Python.
Laboratorio interactivo
Mutabilidad: alias y copias
Dos variables apuntan a listas anidadas. Compara compartir el objeto, copiar solo la lista exterior y copiar también su contenido.
[[1,2]]
Primer elemento → Lista interior N1
[[1,2]]
Primer elemento → Lista interior N1
Exterior: compartido · Primer objeto interior: compartido.
Todavía no has modificado b.
IDs simbólicos, sin direcciones de RAM. El grafo local conserva referencias compartidas; no interpreta código Python. Ejemplo acotado a listas numéricas, no todas las reglas de copia de objetos personalizados.
Experimenta: Con copia superficial, modifica b[0] y después añade una lista exterior. Compara qué cambios aparecen en a. Repite con copia profunda.