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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:52:33