有时候为了批量操作,我们会有获取变量名的需求。
而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