python - 嵌套在另一个数据类中的数据类不能正确更新数据
问题描述
我生成了两个不同的 python 实例,dataclass
其中包括一个嵌套的dataclass
. 当我更新嵌套dataclass
在一个实例中的值(但不是在另一个实例中)时,相同的数据将放置在两个实例的嵌套dataclass
中。这不是我所期望的。
from dataclasses import dataclass
@dataclass
class sub1:
q: int = 10
r: str = "qrst"
@dataclass
class A:
a: int = 1
s1: sub1 = sub1()
if __name__ == '__main__':
a = A()
aa = A()
aa.a = 9
aa.s1.r = "92"
print("a:", repr(a))
print("aa:", repr(aa))
''' Produces --
a: A(a=1, s1=sub1(q=10, r='92'))
aa: A(a=9, s1=sub1(q=10, r='92'))
'''
我希望嵌套dataclass
仅在指定的实例 ( aa
) 中更新,而嵌套dataclass
在另一个实例 ( a
) 中保持不变。
我做错了什么,或者是dataclass
错误的工具?
我拒绝将感谢视为无稽之谈。感谢所有回答的人,以及试图删除它的人。
解决方案
您当前所做的是为该字段提供默认值。由于该值是可变对象,因此对该对象的更改将对数据类的所有实例可见。
您应该做的是提供一个默认工厂sub1
,为每个新实例生成A
实例:
from dataclasses import field
@dataclass
class A:
a: int = 1
s1: sub1 = field(default_factory=sub1)
a = A()
aa = A()
aa.a = 9
aa.s1.r = "92"
print("a:", repr(a)) # a: A(a=1, s1=sub1(q=10, r='qrst'))
print("aa:", repr(aa)) # aa: A(a=9, s1=sub1(q=10, r='92'))
推荐阅读
- javascript - 如果@ char 在使用javascript的字符串中的大括号内,如何不显示下拉菜单或做出反应?
- python - 从 Pandas 中删除依赖于其他行中的多个值的行
- javascript - 运行 Firebase Firestore 事务,包括异步 React Native 函数中的循环
- python - 在python中使用openCV调整图像大小
- javascript - 如何通过修改 .npmrc 文件在 Travis 上运行 lerna publish?
- machine-learning - 如何使用八度 fminunc 函数优化 theta
- c++ - 为用户定义的文件名指定路径
- c# - C# 创建通用项列表以传递给采用基类的函数
- c# - 使用 dicom Leadtools 读取嵌套元素/序列
- c - 错误:*(int **,int,int,int)' 与 'int ()' 的间接级别不同,我该如何解决?