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

Cách thiết lập giá trị mặc định cho tham số hàm trong Python

Việc Python xử lý các giá trị tham số mặc định là một trong những điều khiến hầu hết các lập trình viên Python mới bắt đầu cảm thấy bối rối.

Vấn đề phát sinh khi sử dụng một đối tượng "có thể thay đổi" (mutable) làm giá trị mặc định; tức là một giá trị có thể được sửa đổi ngay tại chỗ, như danh sách (list) hoặc từ điển (dictionary).

Vấn đề với đối tượng mutable làm tham số mặc định

Các đối số mặc định của Python được đánh giá một lần duy nhất khi hàm được định nghĩa, 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 (mutable) và thay đổi nó, bạn sẽ làm thay đổi đối tượng đó cho tất cả các lần gọi hàm sau đó.

def func(data=[]):
    data.append(1)
    return data

func()  # Trả về [1]
func()  # Trả về [1, 1] - cùng một list được sử dụng lại!

Giải pháp đúng đắn

Tạo một đối tượng mới mỗi khi hàm được gọi, bằng cách 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 (None thường là lựa chọn tốt).

def append2(element, foo=None):
    if foo is None:
        foo = []
    foo.append(element)
    return foo

print(append2(12))  # [12]
print(append2(43))  # [43] - list mới được tạo mỗi lần

Đầu ra mong đợi

[12] [43]

Tóm tắt: Luôn sử dụng None làm giá trị mặc định cho các tham số kiểu mutable (list, dict, set...) và khởi tạo đối tượng mới bên trong hàm.