Giá trị mặc định chỉ được tính đúng một lần, tại thời điểm câu lệnh def chạy — không phải mỗi lần gọi hàm.
List đó được gắn vào chính object hàm (add.__defaults__), nên mọi lần gọi không truyền bucket đều dùng chung một list.
python
def add(item, bucket=[]):
bucket.append(item)
return bucket
add(1) # [1]
add(2) # [1, 2] — same list, not a fresh oneCách sửa chuẩn: dùng None làm sentinel rồi khởi tạo bên trong hàm.
python
def add(item, bucket=None):
if bucket is None:
bucket = []
bucket.append(item)
return bucketQuy tắc: default là immutable (None, số, chuỗi, tuple) thì an toàn; default là mutable (list, dict, set, instance) thì bắt buộc dùng sentinel.
Lỗi này hay lộ ra ở __init__ của class hoặc hàm cache tự viết, vì dữ liệu rò rỉ giữa các object.