为数据类添加标签列表时,希望每个实例都有自己的列表。field(default_factory=list)可以在需要默认值时创建新列表,避免把可变默认对象的共享关系弄混。

工厂是创建对象的函数
default_factory接收可调用对象,所以传list,而不是已经创建好的list()。当实例没有显式传入该字段时,工厂提供默认值。示例创建两条笔记,只修改第一条的标签,第二条应保持空列表。
类型标注不会自动验证全部输入
标注为list[str]有助于工具和读者理解,但dataclass本身不会因此把任意传入值都验证成字符串列表。需要严格校验时,应增加适合业务的检查,不能把类型提示当成完整运行时约束。
显式共享仍然可能发生
如果主动把同一个列表传给两个实例,它们仍可能引用同一个对象。默认工厂解决的是默认值创建方式,不会自动深复制所有输入。测试时既检查默认行为,也检查显式参数的预期语义。
可以运行的练习
from dataclasses import dataclass, field
@dataclass
class Note:
tags: list[str] = field(default_factory=list)
first = Note()
second = Note()
first.tags.append("Python")
assert first.tags == ["Python"]
assert second.tags == []
print(first.tags, second.tags)
示例已在本地隔离环境运行检查。使用固定输入,不访问外部接口,也不读取真实业务文件。
资料与继续学习
Python:dataclasses。资料查阅日期:2026年9月28日。步骤与练习由本站整理。
资料查阅与编辑日期:2026年9月28日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END







