python根据变量名获取变量,python获取变量名
Python之谜:如何获取变量名?今天我们讨论一个Python中看似简单的问题,其实并不容易。问题是:如何获得变量的名称?
例如,给定一个变量var,赋给它字符串‘foo’。也就是
在[1]中:var=foo 现在我们需要得到变量var的名字,即 var 。
试试下面两种方法,我们得到的都是变量的值‘foo’,而不是变量的名字‘var’。
in[2]:print var foin[3]:print“% s”% var foo?然后我们探究变量var的所有属性和方法:
在[4]中:printdir (var) [_ _ add _ _ , _ _ class _ _ , _ _ contains _ _ ,大写,居中,]试了一下,发现var中71(这个数是通过printlen (dir)
可见得到变量值(value)容易,得到变量名(name)看起来十分困难。
两个例子在进一步探讨其他方案之前,我们先看看‘获取变量名’在Python编程中是否有实际意义。这里举两个小例子来说明‘获取变量名’的好处。
第一个例子是关于异常处理的。如果可以获得变量名,Python异常的错误信息会变得更有意义。例如:
1 first_num,second_num=1,2 2 if first_num!=second _ num:-3引发运行时错误( %s不等于% s% (first _ num,second _ num))运行时错误:1不等于2此处错误消息的可读性很差。1和2分别是多少?我们需要结合源代码来理解。能够在错误消息中输出1和2的变量名first_num和second_num,无疑是一件好事。
第二个例子是基于一组变量创建一个字典。几个变量是已知的,姓名、地址、年龄、性别,我们想基于它们创建一个字典person。一般可以这样实现:
person={ } person[ name ]=name person[ address ]=address person[ age ]=age person[ gender ]=gender虽然这个实现完全可行,但是对于我这种有洁癖的Python爱好者来说,有两个难受点。第一,变量名重复;第二,赋值语句(无论=赋值还是:赋值)重复。变量越多,重复就越多。
如果可以通过如下所示的循环来实现,代码会更简洁:
对于I in[姓名,地址,年龄,性别]: person [i]=i #因为I是一个变量的值,所以不可行。以上两个例子说明了获取变量名对于Python编程是有好处的。
间接计划。然而,正如我们前面看到的,很难获得Python变量名。那么,为什么不能直接获取Python变量名呢?查阅相关资料后发现,在Python中,变量名是对object的单向(而不是双向)引用。也就是说,根据变量名,可以直接得到它所指向的对象;相反,根据对象,不可能得到指向它的变量名。
之所以有这样的规定,是基于成本的考虑。在程序中,经常会有大量的变量(整数、字符串、列表、字典、快乐流……)。如果每个变量都需要有一个包含指向它的变量名的列表,那么创建和维护这些列表的成本(实现成本、执行成本……)将变得难以承受。
既然直接的方法不可行,有没有间接的方法?Python的inspect模块提供了一个间接的解决方案。以例2为例,基于inspect的For循环实现如下:
import inspectdef retrieve _ name(var):callers _ local _ vars=inspect . current frame()。f_back.f_locals.items()返回[var_name for var_name,var _ val in callers _ local _ vars if var _ val is var]姓名,地址,年龄,性别=bob ,杭州,21, man person={ } for I in[姓名,地址,年龄,性别]:person[retrieve _ name(I)[0]]=iprintperson执行脚本,结果如预期:
root @ Hz ettv 53:~ # python test . py { gender : man , age: 21, name: Bob , address: Hangzhou}这个方案的基本思想是:通过inspect模块的currentframe()方法,得到一个
虽然这种方案在某些情况下是可行的,但是它的缺点是显而易见的:1)实现的复杂度高;2)如果有多个值相同的变量,那么retrieve_name()函数会返回多个变量名,所以无法得到准确的结果。基于这两个因素,这种方法并没有太大的实际意义。
综上所述,我们可以看到,Python编程中没有高效可靠的获取变量名的方法。幸运的是,虽然获得变量名在某些场景中是有益的,但是这种益处通常并不显著,并且通常有替代方案。所以虽然Python不能支持获取变量名的需求,但是日常的Python开发工作不会受到太大影响。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。