使用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
相关产品推荐
相关产品推荐

