Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Tham số truyền vào hàm Python: by value hay by reference?

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ượngSử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.