Trong Python, các đối số hàm luôn được truyền theo tham chiếu (call by object reference). Điều này có thể kiểm tra bằng cách so sánh id() của đối số thực tế, đối số hình thức và đối tượng trả về.
Ví dụ minh họa
def foo(x):
print("id of received argument", id(x))
x.append("20")
return x
a = ["10"]
print("id of argument before calling function", id(a))
b = foo(a)
print("id of returned object", id(b))
print(b)
print(a)
Đầu ra
id of argument before calling function 1475589299912 id of received argument 1475589299912 id of returned object 1475589299912 ['10', '20'] ['10', '20']
Giải thích
- Ba giá trị
id()củaa,xbên trongfoo()vàblà giống nhau. - Khi
x.append("20")được thực hiện, nó sửa đổi trực tiếp đối tượng list gốc màatham chiếu tới. - Do đó, cả
avàbđều phản ánh thay đổi.
Lưu ý: Python sử dụng cơ chế "Call by Object Reference". Với đối tượng immutable (tuple, string, int...), bạn không thể thay đổi giá trị gốc; với đối tượng mutable (list, dict...), bạn có thể sửa đổi nội dung.