Це не зовсім так працює в Python. Python передає посилання на об'єкти. Усередині вашої функції у вас є об'єкт - ви можете вільно мутувати цей об'єкт (якщо це можливо). Однак цілі числа незмінні . Одним з обхідних шляхів є передача цілого числа в контейнер, який може бути мутованим:
def change(x):
x[0] = 3
x = [1]
change(x)
print x
Це в кращому випадку потворно / незграбно, але ти не збираєшся робити щось краще в Python. Причина в тому, що в Python assignment ( =
) бере будь-який об’єкт, який є результатом правої сторони, і прив’язує його до будь-якого, що знаходиться зліва * (або передає відповідній функції).
Розуміючи це, ми можемо зрозуміти, чому немає можливості змінити значення незмінного об'єкта всередині функції - ви не можете змінити жоден з його атрибутів, оскільки він незмінний, і ви не можете просто призначити "змінної" нову значення, оскільки тоді ви фактично створюєте новий об’єкт (який відрізняється від старого) і надаєте йому ім’я, яке мав старий об’єкт у локальному просторі імен.
Зазвичай обхідний шлях полягає у простому поверненні потрібного об’єкта:
def multiply_by_2(x):
return 2*x
x = 1
x = multiply_by_2(x)
* У першому прикладі вище, 3
насправді передається x.__setitem__
.