Python如何动态将字符串作为变量求值、获取列表元素对应变量名
动态变量引用、变量名获取场景的标准实现方案
关于动态拼接列表的初始需求
你一开始定义了两个列表(注意原代码笔误重复定义了strings1,修正后如下):
strings1 = ['text1a','text1b'] strings2 = ['text2a','text2b']
目标是循环动态对每个列表执行"-".join(),输出text1a - text1b、text2a - text2b的结果。你最初尝试把变量名存为字符串列表遍历:
array_vars = [ 'strings1','strings2' ] for x in array_vars: print("-".join(x))
这个写法无法生效的核心原因是:循环中的x只是'strings1'、'strings2'这两个字符串本身,不是指向对应列表的变量引用,join会直接把字符串拆成单个字符拼接,完全不符合预期。
如果硬要通过字符串形式的变量名取值,可以通过作用域查找实现:
for x in array_vars: # 优先从局部作用域查找,找不到再查全局作用域 target = locals().get(x, globals().get(x)) if isinstance(target, list): print("-".join(target))
非常不推荐这种写法:它依赖运行时的作用域状态,可读性极差,很容易因为变量名重名、作用域变动出现难以排查的bug,生产环境不要用。
关于遍历获取元素对应变量名的需求
你遇到的第二个问题,本质是对Python变量的底层逻辑有误解:Python的变量只是对内存中值的引用标签,当你把strings1、strings2直接存入列表时,存进去的只是列表对象的内存引用,完全不会携带它原来绑定的变量名信息。而且同一个值完全可以被赋值给多个不同变量,根本不存在「值对应的原始变量名」这种说法,所以不可能直接从列表元素反推它原来的变量名。
你自己尝试的字典写法,就是这类场景的标准最优解:
import re strings1 = ['football','tennis'] strings2 = ['cards','dominoe'] texto ='I am playing dominoe' array_vars = { "strings1": strings1, "strings2": strings2 } # 推荐用items()同时取键和值,代码更简洁 for var_name, content in array_vars.items(): print(var_name, re.search('|'.join(content), texto, re.I))
运行输出完全符合预期:
strings1 None strings2 <re.Match object; span=(13, 20), match='dominoe'>
这种写法没有任何黑魔法:你显式把需要展示的变量名作为键、对应的数据作为值绑定在一起,代码可读性高、没有兼容问题、调试维护成本极低。
通用最佳实践
所有需要关联「名称标识」和「对应值」的场景,都不要用字符串拼变量名、反查作用域这类奇技淫巧:
- 直接用字典(
dict)结构存储映射关系,键存你需要的名称/标识,值存对应的数据 - 如果要批量处理多个同类型数据,从一开始就不要分散定义
xxx1、xxx2、xxxN这类带编号的独立变量,直接把所有数据按规则存入字典或者列表,从根源上避免动态查找变量的需求。
内容的提问来源于stack exchange,提问作者Eday Gonzalez
相关产品推荐
相关产品推荐

