Saltar a contenido

Paso por valor y referencia

Dependiendo del tipo de dato que enviemos a la función, podemos diferenciar dos comportamientos:

  • Paso por valor: Se crea una copia local de la variable dentro de la función.
  • Paso por referencia: Se maneja directamente la variable, los cambios realizados dentro de la función le afectarán también fuera.

Tradicionalmente:

  • Los tipos simples se pasan por valor: Enteros, flotantes, cadenas, lógicos...
  • Los tipos compuestos se pasan por referencia: Listas, diccionarios, conjuntos...

Ejemplo de paso por valor

Como ya sabemos los números se pasan por valor y crean una copia dentro de la función, por eso no les afecta externamente lo que hagamos con ellos:

def doblar_valor(numero):
    numero *= 2

n = 10
doblar_valor(n)
print(n)
10

Ejemplo de paso por referencia

Sin embargo las listas u otras colecciones, al ser tipos compuestos se pasan por referencia, y si las modificamos dentro de la función estaremos modificándolas también fuera:

def doblar_valores(numeros):
    for i,n in enumerate(numeros):
        numeros[i] *= 2

ns = [10,50,100]
doblar_valores(ns)
print(ns)
[20, 100, 200]

Para modificar los tipos simples podemos devolverlos modificados y reasignarlos:

def doblar_valor(numero):
    return numero * 2

n = 10
n = doblar_valor(n)
print(n)
20

Y en el caso de los tipos compuestos, podemos evitar la modificación enviando una copia:

def doblar_valores(numeros):
    for i,n in enumerate(numeros):
        numeros[i] *= 2

ns = [10,50,100]
doblar_valores(ns[:])  # Una copia al vuelo de una lista con [:]
print(ns)
[10, 50, 100]

Última edición: 25 de Septiembre de 2018