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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:15:43