Nó không hoàn toàn hoạt động theo cách đó trong Python. Python chuyển các tham chiếu đến các đối tượng. Bên trong hàm của bạn, bạn có một đối tượng - Bạn có thể tự do thay đổi đối tượng đó (nếu có thể). Tuy nhiên, số nguyên là bất biến . Một cách giải quyết là chuyển số nguyên vào một vùng chứa có thể bị thay đổi:
def change(x):
x[0] = 3
x = [1]
change(x)
print x
Điều này tốt nhất là xấu / vụng về, nhưng bạn sẽ không làm tốt hơn với Python. Lý do là vì trong Python, gán ( =
) lấy bất kỳ đối tượng nào là kết quả của phía bên phải và liên kết nó với bất kỳ đối tượng nào ở phía bên trái * (hoặc chuyển nó đến hàm thích hợp).
Hiểu được điều này, chúng ta có thể thấy tại sao không có cách nào để thay đổi giá trị của một đối tượng không thể thay đổi bên trong một hàm - bạn không thể thay đổi bất kỳ thuộc tính nào của nó vì nó không thay đổi và bạn không thể chỉ định "biến" mới giá trị vì khi đó bạn thực sự đang tạo một đối tượng mới (khác với đối tượng cũ) và đặt cho nó tên mà đối tượng cũ có trong không gian tên cục bộ.
Thông thường, cách giải quyết là chỉ cần trả lại đối tượng mà bạn muốn:
def multiply_by_2(x):
return 2*x
x = 1
x = multiply_by_2(x)
* Trong trường hợp ví dụ đầu tiên ở trên, 3
thực sự được chuyển đến x.__setitem__
.