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

循环生成类对象时最后元素覆盖所有前置值问题求助

解决循环中类属性被最后一次迭代覆盖的问题

问题根源

你当前的代码中,base_node = Library只是引用了同一个Library类对象,每次修改的是类的类属性NAME。由于classes列表里的所有元素都是这个类的引用,最后一次迭代对NAME的修改会覆盖之前所有的赋值,导致最终输出全是最后一个值。

解决方案

方案1:使用实例属性(推荐,若NAME属于实例而非类)

将NAME改为实例属性,每次循环创建独立的类实例,每个实例拥有自己的NAME值:

class Library():
    def __init__(self, name):
        self.NAME = name
        print('init')

classes = []
for x in ['a', 'b', 'c']:
    base_node = Library(x)
    classes.append(base_node)
    print(base_node.NAME)

print('Now for full list print:')
for n in classes:
    print(n.NAME)

方案2:动态创建子类(若需生成不同的类对象)

如果你的需求是为每个字符串生成新的类而非实例,可以用type()动态创建子类,每个子类拥有独立的类属性NAME:

class Library():
    NAME = 'Library'
    def __init__(self):
        print('init')

classes = []
for x in ['a', 'b', 'c']:
    # 动态生成子类,自定义类名、父类、类属性
    base_node = type(f'Library_{x}', (Library,), {'NAME': x})
    classes.append(base_node)
    print(base_node.NAME)

print('Now for full list print:')
for n in classes:
    print(n.NAME)

验证结果

两种方案的输出都会符合你的预期:

init
a
init
b
init
c
Now for full list print:
a
b
c

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 11:27:07