将类实例添加到列表后元素被覆盖,不使用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
相关产品推荐
相关产品推荐

