Itu tidak cukup berhasil dengan Python. Python meneruskan referensi ke objek. Di dalam fungsi Anda, Anda memiliki objek - Anda bebas untuk mengubah objek itu (jika memungkinkan). Namun, bilangan bulat tidak dapat diubah . Salah satu solusinya adalah dengan meneruskan integer dalam wadah yang dapat dimutasi:
def change(x):
x[0] = 3
x = [1]
change(x)
print x
Ini jelek / kikuk, tetapi Anda tidak akan melakukan yang lebih baik dengan Python. Alasannya adalah karena dalam Python, assignment ( =
) mengambil objek apa pun yang merupakan hasil dari sisi kanan dan mengikatnya ke apa pun yang ada di sisi kiri * (atau meneruskannya ke fungsi yang sesuai).
Memahami hal ini, kita dapat melihat mengapa tidak ada cara untuk mengubah nilai objek yang tidak dapat diubah di dalam fungsi - Anda tidak dapat mengubah atributnya karena tidak dapat diubah, dan Anda tidak dapat menetapkan "variabel" sebagai yang baru. nilai karena kemudian Anda benar-benar membuat objek baru (yang berbeda dari yang lama) dan memberinya nama yang dimiliki objek lama di namespace lokal.
Biasanya solusinya adalah dengan mengembalikan objek yang Anda inginkan:
def multiply_by_2(x):
return 2*x
x = 1
x = multiply_by_2(x)
* Dalam contoh kasus pertama di atas, 3
sebenarnya diteruskan ke x.__setitem__
.