Python Default Argument Bug: Sentinel-and-Rebuild Pattern

Mutable default arguments — the bug that's been in your code for years Most Python developers have shipped this bug. They just don't know it yet. def add_item(item, items=[]):    items.append(item)    return items Looks innocent. Isn't. Most people think the empty list is created fresh on every call. It's not. The default value is evaluated exactly once — when the function is defined. The same list object is reused on every call where you don't pass items explicitly. Call it three times without arguments and you don't get three lists with one item each. You get one list with three items, growing across every call you forget to make. In production this shows up as: a function that caches results between requests when you didn't ask it to. State leaking across users. Tests that pass alone and fail in a suite. The fix is one line: def add_item(item, items=None):    if items is None:        items = []    items.append(item) Mutable defaults are not a feature. They're a sharp edge. Sentinel-and-rebuild is the only safe pattern. #PythonInternals #Python #DataEngineering #SoftwareEngineering #Developer #PythonDeveloper #Backend #CodingInterview #Developers #Programming #Learning #PythonTips

To view or add a comment, sign in

Explore content categories