Python中自定义StructList类实例出现数据共享冲突的问题排查与修复咨询
解决StructList实例共享数据的问题
嘿,这个坑我之前也踩过!根源出在你StructList类的__init__方法里的可变默认参数上,和Struct类的实现完全没关系。
你现在的__init__是这么写的:
def __init__(self, structlist: list[Struct] = []): self.structlist = structlist
这是Python里一个经典的陷阱:可变默认参数(比如空列表[])是在函数定义的时候就初始化的,而不是每次实例化类的时候重新创建。也就是说,所有不传参数的StructList实例,都会共享同一个列表对象——这就是为什么你创建structlist2的时候,它会带着structlist1里的元素。
修复方案
把默认参数改成None,然后在__init__方法内部创建新的空列表:
class StructList: def __init__(self, structlist: list[Struct] | None = None): # 如果没有传入列表,就创建一个全新的空列表 self.structlist = structlist if structlist is not None else [] def append(self, struct: Struct): self.structlist.append(struct) def __iter__(self): for struct in self.structlist: yield struct
为什么这样能解决问题?
现在每次实例化StructList时,如果不传参数,structlist会是None,我们就会在方法内部创建一个新的空列表。这样每个StructList实例都会拥有独立的列表,不会再出现数据共享的情况。
测试验证
再运行你之前的测试代码:
structlist1 = Functional.StructList() structlist1.append(x) structlist1.append(y) for struct in structlist1: print(struct) print() structlist2 = Functional.StructList() for struct in structlist2: print(struct) # 这里不会输出任何内容,structlist2是空的
这下两个实例的列表就完全独立了,内存地址不同,数据也不会互相干扰。
内容的提问来源于stack exchange,提问作者Arios Jentu
相关产品推荐
相关产品推荐

