Python
field()
Learn defaults with field(default_factory=...).
What is field() for?
When a field's default is a mutable object (list, dict, set), you cannot write = [] directly; Python would share it across all instances. Instead, use field(default_factory=list); each new instance gets its own empty list.
Example: members: list = field(default_factory=list). This line calls list() for each new instance and gives a separate empty list. You can pass dict, set or your own function to default_factory.
The shared-list trap
If you write members: list = [], Python uses the same list for all instances. This is a subtle bug: an item added in one instance also appears in another. field(default_factory=list) removes this trap completely.
Similarly, use field(default_factory=dict) for a dict, field(default_factory=set) for a set. For immutable types (int, str, tuple) you can write the default directly; no issue arises.
Exercise Add a field to the Team class
Start with from dataclasses import dataclass, field. Define a Team class with @dataclass; include fields name: str = "" and members: list = field(default_factory=list). Add a method def add(self, m): with body self.members.append(m). Then create t = Team(name="Stars"), add a member with t.add("Ayşe") and print with print(len(t.members)).
Show example solution
# Write the Team dataclass with field
from dataclasses import dataclass, field
@dataclass
class Team:
name: str = ""
members: list = field(default_factory=list)
def add(self, m):
self.members.append(m)
t = Team(name="Stars")
t.add("Ayşe")
print(len(t.members))
Test yourself
-
Complete the default_factory call
from dataclasses import dataclass, field
@dataclass
class Team:
name: str = ""
members: list = field(default_factory=____)
def add(self, m):
self.members.append(m)
Show answer
from dataclasses import dataclass, field
@dataclass
class Team:
name: str = ""
members: list = field(default_factory=list)
def add(self, m):
self.members.append(m)
-
What does members: list = [] cause?
- A syntax error
- Nothing, no problem
- Auto-generates an empty list
- All instances share the same list
Show answer
All instances share the same list — Direct [] shares the same list across all instances; this is a bug.
-
Match the field() parts
- field
- Function
- default_factory
- Factory argument
- list
- Builds empty list
- dict
- Builds empty dict
Next lesson: frozen