Python › Dataclasses & NamedTuples

Why can't you use a mutable default value (like an empty list) directly as a dataclass field default, and how do you use field(default_factory=...) to fix it?

Intermediate

Answer

Using a mutable object (list, dict, set) as a default value would share the SAME object across every instance (the classic Python mutable-default-argument trap), so @dataclass explicitly raises a ValueError at class definition time if you try; field(default_factory=callable) instead calls the given zero-argument function to produce a FRESH object for each new instance.
from dataclasses import dataclass, field

@dataclass
class ShoppingCart:
    items: list = field(default_factory=list)  # a NEW list for each instance

cart1 = ShoppingCart()
cart1.items.append("apple")
cart2 = ShoppingCart()
print(cart2.items)  # [] -- independent from cart1's list, thanks to default_factory
Real-world example Avoiding the classic mutable-default-argument bug when a dataclass field should default to an empty list or dict.

Common follow-ups: What would happen if you simply wrote 'items: list = []' directly, without using field(default_factory=list)?