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:
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ủ đề
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 tagsKhi đư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_listhoặctags, 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 (Nonesentinel 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.
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.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
