python获取变量名的字符串

有时候为了批量操作,我们会有获取变量名的需求。

而python本身是不能直接获取变量名的,例如如下的需求:

a = 1
print(a)  # 显示1

可以看到如果获取变量a,获取不到a这个字符串,而是获取到a的值。

那么如果需要对a这个变量名进行操作,怎么获取到呢?有以下几种办法:

以下版权归深度潜水:

一、获取单独一个变量名的三种办法(还有很多其它办法就不写了):

1、单变量转化之re

import re
def varname(p):
    for line in inspect.getframeinfo(inspect.currentframe().f_back)[3]:
        m = re.search(r'\bvarname\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)',line)
        if m:
            return m.group(1)
if __name__ == '__main__':
    a = 1
    print(varname(a))

2、单变量转化之inspect()

import inspect
# 这是从堆栈内存的第3层开始查找返回变量名称
def retrieve_name(var):
    for fi in inspect.stack()[2:]:
        for item in fi.frame.f_locals.items():
            if var is item[1]:
                return item[0]
    return ""

def outputVar(var):
    print("{} = {}".format(retrieve_name(var),var))
    print(type(retrieve_name(var)))
    print(retrieve_name(var))
    return retrieve_name(var)

a = 1
outputVar(a)

3、单变量转化之locals()或globals()

loc = locals()
def get_variable_name(variable):
    for k,v in loc.items():
        if loc[k] is variable:
            return k
a = 1
print(get_variable_name(a))

以上都可以获取单变量的字符串,进行exec转化既可以进行元编程操作了。

那怎么进行多个变量转化的批量操作呢?

二、放入for循环的多变量转化为字符串

# trans3代码将多变量的列表转化为字符串列表
def trans(vars_list):
    new_var_list = []
    var_dict = {}
    for var in vars_list:
        global_vars = globals()
        for k, v in global_vars.items():
            var_dict[id(v)] = k
        new_var_list.append(var_dict[id(var)])
    return new_var_list
  
a,b,c,d=10,11,12,13
trans([a,b,c,d])

for i in m:  # 可以用for循环操作,配合exec将每个变量进行操作,类似map。更复杂的操作待分析。
    exec(f"{i} += 1")

可以看到,通过以上代码就可以实现了,结果我就不放出来了,大家自己运行吧。注意一点,这个多变量转化可能会产生bug,最好是应用在使用不重复的堆内存的数据,比如列表对象、字典对象等内容上,这样就不会出错了。

参考:
https://www.zhihu.com/question/42768955

Python 中,**变量名本身是无法直接“转化为字符串获取的**,因为变量名只是你在代码中用来引用对象的一个标识符。Python 并没有内置语法可以直接从一个变量反向查出“它被哪个名字命名”。但我们可以借助一些技巧,在特定场景下实现类似效果。 不过,如果你的目标是:**给定一个变量,得到它在当前作用域中的名称(以字符串形式)**,那么可以通过检查 `locals()` 或 `globals()` 来实现逆向查找。 --- ### ✅ 方法一:通过 `locals()` 或 `globals()` 反向查找变量名 ```python def get_var_name(var, scope='local'): """ 根据变量值查找其变量名字符串) 注意:如果有多个变量指向同一个值,可能会返回任意一个。 """ if scope == 'local': frame = inspect.currentframe() var_dict = frame.f_back.f_locals else: var_dict = globals() names = [name for name, value in var_dict.items() if value is var] return names[0] if names else None import inspect # 示例使用 x = 42 name = get_var_name(x) print(name) # 输出: x ``` #### 解释: - 使用了 `inspect` 模块获取调用栈的上一层局部变量。 - 遍历 `f_back.f_locals` 查找值为 `x` 的变量名。 - 注意:如果多个变量指向同一对象(如 `y = x`),可能返回第一个匹配的名字。 - 对不可变对象(如整数、字符串)要小心缓存问题(比如小整数是单例)。 --- ### ✅ 方法二:传入变量名字符串(更安全、常用) 更推荐的方式是**显式传递变量名作为字符串**: ```python def print_var_info(var_name, var_value): print(f"变量 {var_name} 的值是: {var_value}") x = 100 print_var_info('x', x) # 输出: 变量 x 的值是: 100 ``` 或者使用 f-string 调试时自动获取表达式文本(Python 3.8+ 支持 `=)`: ```python x = 100 print(f"{x=}") # 输出: x=100 ``` 这是 Python 3.8+ 引入的 **f-string debugging syntax**,非常方便。 --- ### ✅ 方法三:使用 `locals()` 批量提取变量名和值 ```python a = 1 b = 2 c = 3 for name, value in locals().items(): if not name.startswith('_') and name in ['a', 'b', 'c']: print(f"{name} = {value}") ``` 输出: ``` a = 1 b = 2 c = 3 ``` 适合用于调试或日志记录。 --- ### ⚠️ 局限性说明: - 不能准确处理多个同值变量(例如 `x = y = 42`)。 - 无法处理函数参数以外的作用域(除非手动传入 scope)。 - 不适用于闭包或类属性等复杂结构。 --- ### 推荐实践总结: | 目标 | 推荐方法 | |------|----------| | 调试打印变量名和值 | 使用 `f"{x=}"` | | 动态获取变量名字符串 | 使用 `get_var_name(x)` + `inspect` | | 安全且清晰的做法 | 显式传入 `'x'` 字符串 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值