python-008Đọc toàn bộ đề miễn phí

Sửa lỗi đối số mặc định khả biến trong hàm

Một lập trình viên tập sự tại AI Empire Academy xây dựng hai hàm phụ trợ trong module ghi danh khóa học:

PythonNâng cao30 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

debuggingfunctionsmutable defaultsmemory model

Kiến thức tiên quyết: function defaults, cpython internals, object references.

Nội dung đề bài

Mục tiêu kiến thức

  • Hiểu sâu cơ chế CPython: Tham số mặc định được khởi tạo một lần duy nhất tại thời điểm định nghĩa hàm (function definition time), không phải tại thời điểm gọi hàm (call time).
  • Khắc phục lỗi đối số khả biến (Mutable Default Argument Trap) bằng Sentinel Pattern (None).
  • Bảo vệ an toàn dữ liệu giữa các phiên làm việc độc lập.

Mô tả bài toán

Một lập trình viên tập sự tại AI Empire Academy xây dựng hai hàm phụ trợ trong module ghi danh khóa học:

def enroll_student(student_id: str, enrolled_list: list[str] = []) -> list[str]:
    enrolled_list.append(student_id)
    return enrolled_list

def add_course_metadata(course_id: str, tags: dict[str, str] = {}) -> dict[str, str]:
    tags[course_id] = "active"
    return tags

Khi đưa vào chạy thử, hệ thống xảy ra một lỗi bảo mật nghiêm trọng: Học viên A ghi danh khóa học thì danh sách của học viên B gọi sau đó bị trộn lẫn mã của học viên A, dù học viên B không hề truyền tham số enrolled_list!

Nguyên nhân lỗi

Trong Python, biểu thức đối số mặc định (enrolled_list = [] và tags = {}) được đánh giá duy nhất một lần khi module được nạp vào bộ nhớ. Mọi lần gọi hàm tiếp theo nếu không truyền đối số mới sẽ cùng chia sẻ chính xác một đối tượng list/dict duy nhất trong RAM.

Nhiệm vụ của bạn

Hãy sửa lại hai hàm trên trong tệp solution.py sao cho:

  • Mỗi lần gọi hàm mà không truyền đối số enrolled_list hoặc tags, hàm phải tạo một đối tượng danh sách hoặc từ điển mới hoàn toàn độc lập (None sentinel pattern).
  • Nếu người dùng có chủ động truyền một danh sách hoặc từ điển vào, hàm phải cập nhật trực tiếp trên đối tượng được truyền đó và trả về nó.
  • Đầy đủ Type Hints chuẩn Python.

Input

Hàm được gọi bởi bộ kiểm thử tự động với nhiều kịch bản độc lập liên tiếp.

Output

Trả về danh sách hoặc từ điển tương ứng đã được cập nhật an toàn mà không bị rò rỉ trạng thái giữa các lần gọi.

Ràng buộc

  • Thời gian chạy tối đa: 1000ms.
  • Giới hạn bộ nhớ: 256MB.

Ví dụ 1

Input

enroll_student("SV01")
enroll_student("SV02")

Output

["SV01"]
["SV02"]

Giải thích

Lần gọi thứ 2 không truyền danh sách thì phải tạo một danh sách mới độc lập gồm ["SV02"], không được chia sẻ bộ nhớ hay rò rỉ mã SV01 của lần gọi trước.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.