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

Python循环创建obj1至obj50的foo类对象失败,求原因及解决方法

问题原因与解决办法

嘿,我懂你想直接生成obj1到obj50这类命名变量的需求,咱们先拆解下代码报错的原因,再给你可行的实现方案~

为什么你的代码无法运行?

Python的赋值语法有严格要求:赋值语句的左侧必须是一个合法的变量名,而你写的obj + i是一个字符串拼接表达式,Python根本无法将它识别为要创建的变量名,所以会直接抛出语法错误(SyntaxError)。

实现动态命名变量的方法

如果你坚持要创建obj1到obj50这样的独立变量,可以通过操作Python的命名空间字典来实现:

方法1:操作全局命名空间(脚本顶层场景)

Python的全局命名空间可以通过globals()函数获取,它是一个字典,键是变量名,值是变量对应的对象。我们可以直接往这个字典里添加键值对来创建动态命名的变量:

class foo():
    def __init__(self, name):
        self.name = name

# 生成obj1到obj50
for i in range(1, 51):
    globals()[f"obj{i}"] = foo(i)

# 验证效果
print(obj10.name)  # 输出:10
print(obj37.name)  # 输出:37

方法2:在函数内操作局部命名空间(可选)

如果是在函数内部需要创建这类变量,可以尝试使用locals(),但要注意:Python对局部命名空间的修改有一定限制,某些情况下可能不生效。如果遇到问题,还是建议用全局命名空间或者自己维护一个字典:

def create_objects():
    class foo():
        def __init__(self, name):
            self.name = name
    
    for i in range(1, 51):
        locals()[f"obj{i}"] = foo(i)
    # 函数内可以直接访问这些变量
    print(obj5.name)

create_objects()

额外建议(虽然你提到知道列表,但还是提一嘴)

其实动态创建大量独立变量并不是最佳实践——这些变量散落在命名空间里,后续很难统一遍历、管理或修改。更推荐用字典来集中管理:

class foo():
    def __init__(self, name):
        self.name = name

# 用字典存储所有对象,键是"obj1"这类名称,值是对象
objects = {f"obj{i}": foo(i) for i in range(1, 51)}

# 访问方式
print(objects["obj20"].name)  # 输出:20

这种方式更清晰,也更符合Python的代码风格,后续维护起来会方便很多~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:57:59