Python sử dụng cơ chế "Call by Object Reference" (gọi theo tham chiếu đối tượng), còn gọi là "Call by Sharing".
Quy tắc cốt lõi
- Tất cả tham số là tham chiếu đến đối tượng.
- Nếu đối tượng immutable (int, str, tuple): hành vi như pass-by-value (không thể thay đổi đối tượng gốc).
- Nếu đối tượng mutable (list, dict, set): có thể thay đổi nội dung đối tượng gốc, nhưng không thể gán lại biến tham chiếu trỏ đến đối tượng mới.
Ví dụ: Mutable object (dict) - thay đổi nội dung phản ánh ra ngoài
student = {'Archana': 28, 'krishna': 25, 'Ramesh': 32, 'vineeth': 25}
def test(student):
new = {'alok': 30, 'Nevadan': 28}
student.update(new) # sửa đổi NỘI DUNG dict gốc
print("Trong hàm:", student)
return
test(student)
print("Ngoài hàm:", student)
Trong hàm: {'Archana': 28, 'krishna': 25, 'Ramesh': 32, 'vineeth': 25, 'alok': 30, 'Nevadan': 28}
Ngoài hàm: {'Archana': 28, 'krishna': 25, 'Ramesh': 32, 'vineeth': 25, 'alok': 30, 'Nevadan': 28}
Ví dụ: Immutable object (int) - không thay đổi được gốc
def modify_int(x):
x = 10
print("Trong hàm:", x)
a = 5
modify_int(a)
print("Ngoài hàm:", a)
Trong hàm: 10 Ngoài hàm: 5
Ví dụ: Gán lại tham số mutable (không ảnh hưởng gốc)
def reassign_list(lst):
lst = [1, 2, 3] # tạo list MỚI, gán cho biến cục bộ lst
print("Trong hàm:", lst)
original = [10, 20]
reassign_list(original)
print("Ngoài hàm:", original)
Trong hàm: [1, 2, 3] Ngoài hàm: [10, 20]
Tóm tắt
| Loại đối tượng | Sửa nội dung (mutate) | Gán lại biến (reassign) |
|---|---|---|
| Immutable (int, str, tuple) | Không thể | Chỉ ảnh hưởng biến cục bộ |
| Mutable (list, dict, set) | Có thể (ảnh hưởng gốc) | Chỉ ảnh hưởng biến cục bộ |
Mẹo: Tránh side effect không mong muốn
- Tạo bản sao:
lst.copy(),list(lst),lst[:],dict(d). - Dùng
copy.deepcopy()cho object lồng nhau.