No funciona de esa manera en Python. Python pasa referencias a objetos. Dentro de su función tiene un objeto: puede mutar ese objeto (si es posible). Sin embargo, los números enteros son inmutables . Una solución es pasar el número entero en un contenedor que se puede mutar:
def change(x):
x[0] = 3
x = [1]
change(x)
print x
Esto es feo / torpe en el mejor de los casos, pero no le irá mejor en Python. La razón es porque en Python, la asignación ( =
) toma cualquier objeto que sea el resultado del lado derecho y lo une a lo que esté en el lado izquierdo * (o lo pasa a la función apropiada).
Al comprender esto, podemos ver por qué no hay forma de cambiar el valor de un objeto inmutable dentro de una función: no puede cambiar ninguno de sus atributos porque es inmutable y no puede simplemente asignar a la "variable" una nueva value porque entonces en realidad está creando un nuevo objeto (que es distinto del anterior) y le está dando el nombre que tenía el objeto anterior en el espacio de nombres local.
Por lo general, la solución es simplemente devolver el objeto que desea:
def multiply_by_2(x):
return 2*x
x = 1
x = multiply_by_2(x)
* En el primer caso de ejemplo anterior, en 3
realidad se pasa a x.__setitem__
.