En muchos lenguajes de programación, los parámetros que se pasan a una funciónpueden hacerlo de dos maneras:
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:
int, float, str, tuple), no
puede modificarse dentro de la función.
list, dict, set), sí puede
modificarse desde dentro de la función.
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.
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.
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.
Python proporciona la función id() para inspeccionar el identificador único de
un objeto en memoria.
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.
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 IDs coinciden, ya que la
lista no fue
reasignada dentro de la función.
nueva_lista = lista_original.copy()