Python内部类循环引用同一内存问题求助:如何创建独立实例?
解决Python内部类实例复用导致的对象引用问题
核心问题是循环中复用了同一个Subject实例,而非每次创建新对象。Python里不需要new关键字,但只有调用类构造器(如Student.Subject())才会生成新实例。你的代码中,student.subject是Student初始化时创建的单个Subject对象,循环里只是把这个对象的引用重复存入字典,所有条目指向同一内存地址,最后一次修改的name会覆盖之前的赋值。
修正方案1:循环内创建新的Subject实例
class Student: class Subject: def __init__(self): self.name = '' def __init__(self): self.name = '' self.courses = {} # 不再提前创建单个Subject实例 def test(): courses = ['Subject A', 'Subject B'] student = Student() student.name = 'apple' for i, course in enumerate(courses): # 每次循环生成新的Subject实例 new_subject = Student.Subject() new_subject.name = course student.courses[i] = new_subject print(student.courses[0].name) # 输出 Subject A print(student.courses[1].name) # 输出 Subject B test()
修正方案2:优化Subject构造器,简化实例创建
class Student: class Subject: # 直接在构造时传入name参数 def __init__(self, name): self.name = name def __init__(self): self.name = '' self.courses = {} def test(): courses = ['Subject A', 'Subject B'] student = Student() student.name = 'apple' for i, course in enumerate(courses): # 一行完成实例创建与赋值 student.courses[i] = Student.Subject(course) print(student.courses[0].name) # 输出 Subject A print(student.courses[1].name) # 输出 Subject B test()
关键说明
- Python中,
类名()的作用等同于Java的new 类名(),每次调用都会生成独立的新实例,拥有专属内存地址。 - 避免复用已有的实例引用,每次需要新对象时直接调用构造器即可。
内容的提问来源于stack exchange,提问作者Min UD
相关产品推荐
相关产品推荐

