Objetos mutables en python
Supongamos que tenemos definida en python la siguiente función:
def f(x, l=[]):
for i in range(x):
l.append(i)
print(l)
Si tuviésemos que decir cual es el resultado de hacer las siguientes llamadas sucesivas a la función, muchos pensareis que el resultado que se obtendría es:
>>> f(2)
[0, 1]
>>> f(3, [3, 4, 5])
[3, 4, 5, 0, 1, 2]
>>> f(3)
[0, 1, 2] RESULTADO ERRONEO
Sin embargo, el resultado que obtenemos es el siguiente:
>>> f(2)
[0, 1]
>>> f(3, [3, 4, 5])
[3, 4, 5, 0, 1, 2]
>>> f(3)
[0, 1, 0, 1, 2] RESULTADO CORRECTO
Esto es debido a que las listas en python son objetos mutables y por tanto cuando son definidos como parámetros por defecto en una función, la lista se comporta como una variable global a todas las ejecuciones de la función.
Cuando llamamos a f(2) por primera vez se utiliza [] que es el valor por defecto de la lista. Pero cuando se ejecuta f(3) se utiliza la misma variable global que cuando se llamó a f(2) cuyo ultimo valor es [0, 1].
Tabla de Objetos en python
| Objeto | Mutable |
|---|---|
| bool | No |
| int | No |
| float | No |
| list | Sí |
| tuple | No |
| str | No |
| set | Sí |
| frozenset | No |
| dict | Sí |
Los objetos mutables en python son pasados por referencia. A diferencia del resto que es como si fuesen pasados por valor (ya que son inmutables). Un ejemplo de ello es el siguiente código:
def f(l):
l.append(23)
>>> l = [37]
>>> f(l)
>>> print(l)
[37, 23]
Volver
Publicado: 1 de Feb. de 2020