Việc xử lý các giá trị tham số mặc định của Python là một trong số những điều có thể làm phiền hầu hết các lập trình viên Python mới.
Nguyên nhân gây ra sự cố là sử dụng một đối tượng "có thể thay đổi" làm giá trị mặc định; nghĩa là một giá trị có thể được sửa đổi tại chỗ, như danh sách hoặc từ điển.
Một danh sách mới được tạo mỗi khi hàm được gọi nếu đối số thứ hai không được cung cấp, do đó ĐẦU RA MONG ĐỢI là:
[12] [43]
Một danh sách mới được tạo một lần khi hàm được xác định và cùng một danh sách được sử dụng trong mỗi lần gọi kế tiếp.
Các đối số mặc định của Python được đánh giá một lần khi hàm được xác định, không phải mỗi khi hàm được gọi. Điều này có nghĩa là nếu bạn sử dụng một đối số mặc định có thể thay đổi và thay đổi nó, bạn cũng sẽ và đã thay đổi đối tượng đó cho tất cả các lệnh gọi hàm trong tương lai.
Chúng ta nên làm gì
Tạo một đối tượng mới mỗi khi hàm được gọi, bằng cách sử dụng một đối số mặc định để báo hiệu rằng không có đối số nào được cung cấp (Không có đối số nào thường là một lựa chọn tốt).
Ví dụ
def func(data=[]): data.append(1) return data func() func() def append2(element, foo=None): if foo is None: foo = [] foo.append(element) return foo print(append2(12)) print(append2(43))
Đầu ra
[12] [43]