En muchos lenguajes de programación, los parámetros que se pasan a una funciónpueden hacerlo de dos maneras:
- Paso por valor: Se envía una copia de la variable. Las modificaciones dentro de la función no afectan al valor original.
- Paso por referencia: Se envía la dirección de memoria de la variable. Lasmodificaciones dentro de la función sí afectan al valor original.
¿Cómo funciona esto en Python?
Python no implementa estrictamente ni paso por valor ni paso por referencia como lo hacen otros lenguajes (como C o Java). En su lugar, Python utiliza un modelo conocido como paso por asignación de objetos (object reference passing).
Esto significa que:
- Todos los valores en Python son objetos.
- Lo que se pasa a una función es una referencia al objeto, no una copia de su valor.
- Sin embargo, si el objeto es inmutable (como
int
,float
,str
,tuple
), no puede modificarse dentro de la función. - Si el objeto es mutable (como
list
,dict
,set
), sí puede modificarse desde dentro de la función.
Ejemplo 1: Objeto inmutable (int
)
def funcion(entrada):
entrada = 0
print("Dentro de la función:", entrada)
x = 10
funcion(x)
print("Fuera de la función:", x)
Aquí, aunque la variable entrada
fue modificada dentro de la función, la variable original x
permanece intacta, ya que los int
son inmutables. Python crea una nueva referencia dentro de la función.
Ejemplo 2: Objeto mutable (lista)
def funcion(entrada):
entrada.append(4)
print("Dentro de la función:", entrada)
x = [1, 2, 3]
funcion(x)
print("Fuera de la función:", x)
En este caso, la función sí modifica la lista original, porque las listas son objetos mutables, y ambas variables (entrada
y x
) apuntan al mismo objeto en memoria.
Cuidado: reasignar no modifica el objeto original
Veamos ahora un ejemplo donde se reemplaza el contenido de una lista en lugar de modificarla:
def funcion(entrada):
entrada = [] # Reasignación local
entrada.append(99)
print("Dentro de la función:", entrada)
x = [1, 2, 3]
funcion(x)
print("Fuera de la función:", x)
Aquí, la línea entrada = []
crea una nueva lista dentro del entorno local de la función, sin afectar la lista original x
.
¿Cómo saber si dos variables apuntan al mismo objeto?
Python proporciona la función id()
para inspeccionar el identificador único de un objeto en memoria.
Comparando referencias:
def funcion(entrada):
print("ID dentro de la función:", id(entrada))
x = 5
print("ID original:", id(x))
funcion(x)
Si entrada
y x
tienen el mismo id
, significa que apuntan al mismo objeto. Si tienen id
distintos, Python ha creado una nueva referencia.
Otro ejemplo con listas:
def funcion(entrada):
print("ID dentro de la función:", id(entrada))
x = [1, 2, 3]
print("ID original:", id(x))
funcion(x)
En este segundo caso, verás que los ID
s coinciden, ya que la lista no fue
reasignada dentro de la función.
Recomendaciones:
- Siempre que se trabaje con objetos mutables dentro de funciones, tener cuidado de no modificar accidentalmente el objeto original si no es deseado.
- Si necesitas evitar la modificación de un objeto mutable, considera hacer una copia explícita:
nueva_lista = lista_original.copy()