Python中如何根据变量i的值获取对应var_序号的变量值
Python 动态拼接变量名取值的实现方案
先还原你提到的基础代码场景:
# 你目前已定义的零散变量 var_1 = 10 var_2 = 20 var_4 = 40 var_5 = 50 i = 4 # 你期望实现的等效逻辑:select_value = var_ + i 最终得到40
Python 不支持 Java 那种直接拼接标识符当变量名的原生写法,实际能用的实现按推荐优先级排序如下:
- 方案1:替换为字典存储同组变量(最推荐,无副作用)
本来以var_为前缀的零散变量,本质是一组带编号的关联值,完全没必要散落定义成全局变量,直接用字典把编号当 key 存储就完全匹配需求,写法还最稳妥:
这种写法没有性能损耗,IDE 还能正常做语法检查,后续新增、删除变量都不会有隐蔽 bug,是 Python 社区处理这类需求的标准做法。# 把零散变量收拢到字典 var_group = { 1: 10, 2: 20, 4: 40, 5: 50 } i = 4 select_value = var_group[i] print(select_value) # 输出40,符合预期 - 方案2:通过内置命名空间字典查找(不修改原有变量定义时可用)
Python 的所有全局变量,本身就存储在globals()返回的全局命名空间字典里;函数内部的局部变量,存在locals()返回的局部命名空间字典里。只要拼出完整的变量名字符串,就能直接当 key 取值:
注意:如果拼出来的变量名不存在,会直接抛出 KeyError,需要自己加异常判断处理不存在的场景。var_1 = 10 var_2 = 20 var_4 = 40 var_5 = 50 i = 4 # 拼接出完整的目标变量名 target_name = f"var_{i}" # 全局变量用globals()查,局部变量换成locals() select_value = globals()[target_name] print(select_value) # 输出40 - 方案3:用 eval 执行拼接的表达式(仅临时测试用,不推荐)
这种写法最贴近你一开始想的“直接拼变量名”的逻辑,靠eval把字符串转成可执行的 Python 表达式取值:
不推荐在正式项目使用的原因:var_1 = 10 var_2 = 20 var_4 = 40 var_5 = 50 i = 4 select_value = eval(f"var_{i}") print(select_value) # 同样可以输出40eval会无差别执行传入的字符串代码,如果拼接的内容来源不可信,会有严重的代码注入风险;哪怕是自己写的拼接字符串,因为完全绕开了 IDE 的静态语法检查,变量名拼错、作用域不对的问题都没法在写代码时提前发现,调试成本很高。
补充提醒:不管是用
globals()查还是用eval执行,本质都是绕开 Python 的静态变量校验机制,除非有特殊需求没法改用字典存储,否则优先用第一种字典方案,能少踩很多后续的维护坑。
内容的提问来源于stack exchange,提问作者jlozasi
相关产品推荐
相关产品推荐

