Default argument expressions are evaluated once when the `def` statement executes, not on each call. The same list object is shared across all function calls.
Buggy Code
def add_item(item, basket=[]): # Flawed: basket is created ONCE at function definition time!
basket.append(item)
return basket
print(add_item("apple")) # ['apple']
print(add_item("banana")) # ['apple', 'banana'] - ACCUMULATES across calls!
Correct Solution
def add_item(item, basket=None):
if basket is None:
basket = [] # Fresh list created on every call
basket.append(item)
return basket
print(add_item("apple")) # ['apple']
print(add_item("banana")) # ['banana']