Non funziona in questo modo in Python. Python passa i riferimenti agli oggetti. All'interno della tua funzione hai un oggetto: sei libero di mutare quell'oggetto (se possibile). Tuttavia, i numeri interi non sono modificabili . Una soluzione alternativa consiste nel passare il numero intero in un contenitore che può essere modificato:
def change(x):
x[0] = 3
x = [1]
change(x)
print x
Questo è brutto / goffo nella migliore delle ipotesi, ma non farai di meglio in Python. Il motivo è perché in Python, assignment ( =
) prende qualunque oggetto sia il risultato del lato destro e lo lega a qualunque cosa si trovi sul lato sinistro * (o lo passa alla funzione appropriata).
Comprendendo questo, possiamo vedere perché non c'è modo di cambiare il valore di un oggetto immutabile all'interno di una funzione: non puoi cambiare nessuno dei suoi attributi perché è immutabile e non puoi semplicemente assegnare alla "variabile" un nuovo valore perché in realtà stai creando un nuovo oggetto (che è distinto da quello vecchio) e dandogli il nome che il vecchio oggetto aveva nello spazio dei nomi locale.
Di solito la soluzione alternativa consiste nel restituire semplicemente l'oggetto che desideri:
def multiply_by_2(x):
return 2*x
x = 1
x = multiply_by_2(x)
* Nel primo caso di esempio sopra, 3
viene effettivamente passato a x.__setitem__
.