假设现在存在一个值为1变量名为a的变量,如何通过一个函数获取该变量的变量名a?
上面这个需求来源于某群友的一个要求,希望能有一个这样的函数来方便打印。
这个需求很扯淡啊,为什么不用格式化输出?它回复到‘懒’,好吧,懒确实是程序员技术进步的第一推动力。
从变量名获取变量值
当时第一个想法,从变量获取变量名是相当麻烦的事情,老哥你就用用变量名吧。
def print_var(x:str)->None:
print(s,"=",eval(s))
粗暴简单的eval,完美解决你的困难。
内心小剧场:安全不安全管我何事
使用locals
毫无疑问,这样的方法遭受到群里老哥的拒绝,要多打两个引号,老哥,你也太懒了吧。
虽然python作为一门动态语言,是肯定有反射这个功能的,但是想从变量获取变量名还是很麻烦的。
def get_variable_name(x)->str:
for k,v in locals().items():
if v is x:
return k
def print_var(x)->None:
print(get_variable_name(x),'=',x)
当然上述代码还是有一些小bug的,比如下面的代码,但是无伤大雅,
a = 1
b = 1
print_var(a)
print_var(b)
带着一些小小的得意,另一个群友发来了这样一张回答
气氛瞬间凝固了
另一种通过变量名获取变量值的方法
来源于别人提供的知乎回答
import sys
def append(list_, name):
list_.append((name, sys._getframe().f_back.f_locals[name]))
>>> mylist = []
>>> myvar = 12
>>> append(mylist, 'myvar')
>>> mylist
[('myvar', 12)]
原回答可以作为参考,其中还提供了inspect+re来获取的方法,在这就不赘述了,以免教坏别人。