You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用attrs库时不同User实例共享errors列表的异常排查

attrs库实例共享可变默认值问题排查

我正在使用attrs库做实验,遇到了如下代码的异常行为:

定义的类

@define
class User:
    name = field()
    errors = field(default=[])

    def compute_errors(self, error):
        self.errors.append(error)

运行脚本

user1 = User(name="Miguel")

user1.compute_errors("Error 1")

user2 = User(name="Diogo")

print(user1)
print(user2)

输出结果

User(name='Miguel', errors=['Error 1'])
User(name='Diogo', errors=['Error 1'])

这让我十分困惑,因为user1和user2应该是不同的对象。我查阅了文档但未找到相关说明,请问这是什么原因?


更新1
我完全理解可变默认参数的相关原理,但不明白为何这一情况会出现在类属性中。如果不使用attrs库,代码运行符合预期,user2实例化时errors列表为空。

更新3
我已找到该问题的答案:在attrs库中,直接给field()设置default=[]这类可变默认值时,会导致所有实例共享同一个可变对象。正确的做法是使用factory参数来生成新的可变对象,比如field(factory=list),这样每个实例初始化时都会创建一个全新的列表。


内容的提问来源于stack exchange,提问作者Miguel Andrade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:35:18