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

将类实例添加到列表后元素被覆盖,不使用deepcopy的替代方案有哪些?

列表中类实例被最后一个对象覆盖的非deepcopy解决方案

核心问题在于列表存储的是对象引用,而非对象本身。你反复修改同一个Person实例的属性后添加到列表,导致列表里的所有元素指向同一个内存地址的对象,最终打印的都是该对象的最终属性值。

以下是不用deepcopy的解决方案:

  • 每次创建新的实例
    不再复用同一个对象,每次添加前新建Person实例,确保列表中每个元素都是独立对象。

    class Person:
        def __init__(self):    
            self.age = None
    
    list_of_lists = []
    
    p1 = Person()
    p1.age = 40
    list_of_lists.append(p1)
    
    # 新建独立实例p2
    p2 = Person()
    p2.age = 20
    list_of_lists.append(p2)
    
    for obj in list_of_lists: 
        print(obj.age)
    

    输出:

    40
    20
    
  • 给类添加自定义复制方法
    在Person类中实现一个返回新实例的方法,手动复制当前对象的属性,生成独立的新对象。

    class Person:
        def __init__(self):    
            self.age = None
        
        def copy(self):
            new_person = Person()
            new_person.age = self.age
            return new_person
    
    list_of_lists = []
    p1 = Person()
    
    p1.age = 40
    list_of_lists.append(p1)
    
    # 通过copy方法创建新实例
    p2 = p1.copy()
    p2.age = 20
    list_of_lists.append(p2)
    
    for obj in list_of_lists: 
        print(obj.age)
    
  • 修改构造方法直接传入属性
    调整__init__方法,允许初始化时直接传入age参数,创建实例时就完成赋值,避免后续修改同一个实例。

    class Person:
        def __init__(self, age=None):    
            self.age = age
    
    list_of_lists = []
    
    # 直接创建带属性的实例并添加
    list_of_lists.append(Person(40))
    list_of_lists.append(Person(20))
    
    for obj in list_of_lists: 
        print(obj.age)
    
  • 使用工厂函数生成实例
    编写一个专门的函数来创建Person实例,每次调用都返回新对象,简化创建流程。

    class Person:
        def __init__(self):    
            self.age = None
    
    def create_person(age):
        p = Person()
        p.age = age
        return p
    
    list_of_lists = []
    list_of_lists.append(create_person(40))
    list_of_lists.append(create_person(20))
    
    for obj in list_of_lists: 
        print(obj.age)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:12:33