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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:57:24