Python dataclass设置列表默认值出现mutable default报错如何解决
错误原因
Python的dataclass禁止直接为可变类型(包括list、dict、set等)设置字面量默认值,核心原因是类定义阶段就会生成这个可变对象,后续所有类实例都会共享同一个对象,很容易引发意料之外的属性修改问题,因此报错提示要求用default_factory来生成默认值。
修复方案
你开启了frozen=True的不可变类特性,修复后代码如下:
from dataclasses import dataclass, field @dataclass(frozen=True) class MyClass: my_list: list = field(default_factory=lambda: ["list1", "list2", "list3"]) my_list2: list = field(default_factory=lambda: ["list1", "list2", "list3"])
补充说明
default_factory接收一个无参可调用对象,每次创建类实例的时候都会调用这个对象生成全新的默认值,避免了所有实例共享同一个可变对象的问题- 如果你需要访问字段默认值,不能直接用
MyClass.my_list的方式访问,需要先实例化类:执行print(MyClass().my_list)即可正常输出 - 如果多个字段的默认列表内容完全相同,也可以单独定义生成默认列表的函数复用:
from dataclasses import dataclass, field def get_default_list(): return ["list1", "list2", "list3"] @dataclass(frozen=True) class MyClass: my_list: list = field(default_factory=get_default_list) my_list2: list = field(default_factory=get_default_list)
内容的提问来源于stack exchange,提问作者mark12345
相关产品推荐
相关产品推荐

