Não funciona bem assim em Python. Python passa referências para objetos. Dentro de sua função, você tem um objeto - você está livre para modificar esse objeto (se possível). No entanto, os inteiros são imutáveis . Uma solução alternativa é passar o número inteiro em um contêiner que pode sofrer mutação:
def change(x):
x[0] = 3
x = [1]
change(x)
print x
Isso é feio / desajeitado na melhor das hipóteses, mas você não vai se sair melhor em Python. A razão é porque no Python, atribuição ( =
) pega qualquer objeto que seja o resultado do lado direito e o vincula ao que estiver no lado esquerdo * (ou o passa para a função apropriada).
Compreendendo isso, podemos ver porque não há como alterar o valor de um objeto imutável dentro de uma função - você não pode alterar nenhum de seus atributos porque é imutável, e você não pode simplesmente atribuir à "variável" um novo valor porque então você está realmente criando um novo objeto (que é diferente do antigo) e dando a ele o nome que o objeto antigo tinha no namespace local.
Normalmente, a solução alternativa é simplesmente retornar o objeto que você deseja:
def multiply_by_2(x):
return 2*x
x = 1
x = multiply_by_2(x)
* No primeiro caso de exemplo acima, 3
realmente é passado para x.__setitem__
.