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?
IntermediateAnswer
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_factoryReal-world example Avoiding the classic mutable-default-argument bug when a dataclass field should default to an empty list or dict.