Cách sử dụng và ghi chú các đối số mặc định trong các hàm Python

Kinh doanh

Đặt đối số mặc định trong định nghĩa hàm Python khiến giá trị mặc định được sử dụng nếu đối số bị bỏ qua trong khi gọi hàm.

Các chi tiết sau đây được mô tả dưới đây.

  • Đặt đối số mặc định
  • Ràng buộc về vị trí của các đối số mặc định
  • Lưu ý rằng khi một danh sách hoặc từ điển được sử dụng làm giá trị mặc định

Đặt đối số mặc định

Nếu tên đối số = giá trị mặc định trong định nghĩa hàm, giá trị mặc định sẽ được sử dụng khi đối số tương ứng bị bỏ qua.

def func_default(arg1, arg2='default_x', arg3='default_y'):
    print(arg1)
    print(arg2)
    print(arg3)

func_default('a')
# a
# default_x
# default_y

func_default('a', 'b')
# a
# b
# default_y

func_default('a', arg3='c')
# a
# default_x
# c

Ràng buộc về vị trí của các đối số mặc định

Đặt đối số mặc định trước đối số bình thường (đối số không có giá trị mặc định nào được chỉ định) khi xác định hàm dẫn đến lỗi.
SyntaxError

# def func_default_error(arg2='default_a', arg3='default_b', arg1):
#     print(arg1)
#     print(arg2)

# SyntaxError: non-default argument follows default argument

Lưu ý rằng khi một danh sách hoặc từ điển được sử dụng làm giá trị mặc định

Nếu một đối tượng có thể cập nhật (có thể thay đổi) như danh sách hoặc từ điển được chỉ định làm giá trị mặc định, thì đối tượng đó sẽ được tạo khi hàm được xác định. Sau đó, khi hàm được gọi mà không có đối số tương ứng, đối tượng tương tự sẽ được sử dụng.

Giá trị đối số mặc định được đánh giá từ trái sang phải khi định nghĩa hàm được thực thi. Điều này có nghĩa là biểu thức đối số mặc định chỉ được đánh giá một lần khi hàm được xác định và cùng một giá trị “được tính toán” được sử dụng cho mỗi lần gọi.
8.7. Function definitions — Python 3.10.2 Documentation

Do đó, ví dụ: nếu một hàm được định nghĩa lấy danh sách hoặc từ điển làm đối số mặc định của nó và thêm các phần tử vào nó và được gọi nhiều lần mà không có đối số đó, các phần tử sẽ được thêm nhiều lần vào cùng một đối tượng.

Ví dụ cho một danh sách.

def func_default_list(l=[0, 1, 2], v=3):
    l.append(v)
    print(l)

func_default_list([0, 0, 0], 100)
# [0, 0, 0, 100]

func_default_list()
# [0, 1, 2, 3]

func_default_list()
# [0, 1, 2, 3, 3]

func_default_list()
# [0, 1, 2, 3, 3, 3]

Ví dụ cho một từ điển.

def func_default_dict(d={'default': 0}, k='new', v=100):
    d[k] = v
    print(d)

func_default_dict()
# {'default': 0, 'new': 100}

func_default_dict(k='new2', v=200)
# {'default': 0, 'new': 100, 'new2': 200}

Một đối tượng mới được tạo mỗi khi hàm được gọi.

def func_default_list_none(l=None, v=3):
    if l is None:
        l = [0, 1, 2]
    l.append(v)
    print(l)

func_default_list_none()
# [0, 1, 2, 3]

func_default_list_none()
# [0, 1, 2, 3]