Cela ne fonctionne pas tout à fait de cette manière en Python. Python transmet des références à des objets. Dans votre fonction, vous avez un objet -- Vous êtes libre de muter cet objet (si possible). Cependant, les entiers sont immuable . Une solution de contournement consiste à passer l'entier dans un conteneur qui peut être muté :
def change(x):
x[0] = 3
x = [1]
change(x)
print x
Au mieux, c'est moche et maladroit, mais vous ne ferez pas mieux en Python. La raison en est qu'en Python, l'affectation ( =
) prend l'objet qui est le résultat du côté droit et le lie à ce qui est du côté gauche *(ou le passe à la fonction appropriée).
En comprenant cela, nous pouvons voir pourquoi il n'y a aucun moyen de changer la valeur d'un objet immuable à l'intérieur d'une fonction -- vous ne pouvez changer aucun de ses attributs parce qu'il est immuable, et vous ne pouvez pas simplement assigner une nouvelle valeur à la "variable" parce qu'alors vous créez réellement un nouvel objet (qui est distinct de l'ancien) et lui donnez le nom que l'ancien objet avait dans l'espace de noms local.
En général, la solution de contournement consiste simplement à retourner l'objet que vous voulez :
def multiply_by_2(x):
return 2*x
x = 1
x = multiply_by_2(x)
*Dans le premier exemple de cas ci-dessus, 3
est en fait transmis à x.__setitem__
.