En Python, los parámetros se pasan por el principio de 'call by object reference' (o 'call by sharing'). Esto significa que la función recibe una referencia al objeto, no el objeto mismo. Si el objeto es mutable, se puede cambiar su contenido dentro de la función, y esos cambios se reflejarán en la variable externa. Para los objetos inmutables, como números o cadenas, cambiar algo dentro de la función crea un nuevo objeto, sin afectar al original.
Ejemplo para un objeto mutable:
def add_value(lst): lst.append(42) nums = [1, 2, 3] add_value(nums) print(nums) # [1, 2, 3, 42]
Para un objeto inmutable:
def add_value(num): num += 10 x = 5 add_value(x) print(x) # 5
Pregunta: "¿Se pasan en Python las variables a las funciones por referencia o por valor?"
Respuesta: Ni una ni otra en el sentido clásico. La variable pasa una referencia al objeto, pero no la variable misma, y no se puede reemplazar el objeto para la variable externa.
Historia En uno de los proyectos para el parsing de datos, se utilizó una función para filtrar una lista. No se creaba una nueva lista dentro de la función, y la filtración se hacía mediante cambios en la lista original. Esto llevaba a la eliminación de los datos originales; después de varias ejecuciones del script, los datos ya no estaban.
Historia Un desarrollador junior pensaba que las cadenas se podían cambiar "por referencia" dentro de la función, ya que podía modificar otros parámetros (listas). Como resultado, después de llamar a la función, el programa no obtenía los cambios esperados (la cadena no cambió), lo que causaba errores confusos.
Historia En una API REST para filtrar datos de entrada, el desarrollador olvidó hacer una copia del diccionario de parámetros, y durante la validación, los valores "se perdían": los parámetros se eliminaban del objeto original, lo que rompía la lógica de solicitudes posteriores.