Python中动态创建变量后按名称直接访问的实现方法咨询
解决Python动态创建变量后的访问问题
首先,你的代码里print(u_{i})报错的原因很直接——这是无效的Python语法。Python不会自动把{i}替换成变量i的值来生成变量名,这种写法本身就不符合变量命名规则,所以解释器会直接报错。
先给你快速解决当前问题的方法
如果想在循环里或者循环后访问这些动态创建的变量,有两种可行方式:
- 直接写变量名:比如你已经创建了
u_1到u_10,直接写print(u_1)、print(u_5)就能正常输出,这部分你之前已经验证过是可行的。 - 通过
globals()动态访问:如果需要在循环中或者通过变量i的值来访问对应的变量,还是得用你创建变量时的方式,比如:
NG=10 for i in range(1, NG+1 ): globals()[f"u_{i}"] = i # 循环打印所有动态创建的变量 for i in range(1, NG+1 ): print(globals()[f"u_{i}"]) # 访问特定的变量,比如u_3 print(globals()["u_3"])
更重要的:不推荐用globals()创建动态变量
虽然这种方式能实现需求,但在Python里这是不推荐的做法,原因有几个:
- 污染全局命名空间,很容易和其他变量重名导致意外覆盖,调试起来特别麻烦。
- 代码可读性差,其他开发者看到
u_1这类变量会困惑它的来源。 - 后续维护成本高,比如要修改、删除这些变量时,很难批量操作。
更好的替代方案:用字典或命名空间存储
字典天生就是用来存储键值对的,完全能满足你的需求,而且更规范、更灵活:
NG=10 u_vars = {} # 创建一个空字典 for i in range(1, NG+1 ): u_vars[f"u_{i}"] = i # 通过键名直接访问,和你想要的"变量名访问"逻辑一致 print(u_vars["u_1"]) print(u_vars["u_10"]) # 循环遍历所有键值对 for name, value in u_vars.items(): print(f"{name} = {value}")
如果觉得用字典的[]访问不够直观,还可以用types.SimpleNamespace来实现类似属性的访问方式,和直接访问变量的体验几乎一致:
from types import SimpleNamespace NG=10 u_vars = SimpleNamespace() for i in range(1, NG+1 ): setattr(u_vars, f"u_{i}", i) # 直接用点语法访问 print(u_vars.u_1) print(u_vars.u_5)
内容的提问来源于stack exchange,提问作者Abbel
相关产品推荐
相关产品推荐

