2011-12-17 119 views
1

我试图访问变量的名称。例如,如果我调用一个函数打印列表(printL) 并想打印我的列表名称"A_minus_B"访问变量的名称

def printL (xlist): 
    print "****************************" 
    print "name of list" 
    print (" entries : "),len(xlist) 
    print xlist 
    print "****************************" 
    return() 

我怎样才能获得的功能打印"A_minus_B",而不是"name of list",我用时名调用函数printL(A_minus_B)

+1

如果您告诉我们您所使用的语言它将帮助。 – 2011-12-17 20:20:48

+0

对不起。这是为Python 2.7 – 2011-12-17 23:09:12

+1

Duplicate:http://stackoverflow.com/questions/592746/how-can-you-print-a-variable-name-in-python – heltonbiker 2011-12-18 00:20:39

回答

0

你不能。 *Python language reference中讨论了详细的原因,但基本上,当您拨打printL(A_minus_B)时Python执行的操作是将标记为A_minus_B的值与创建的新标签xlist恰好相同。从那时起,标签xlist与其他标签A_minus_B完全没有关系,事实上,标记为A_minus_Bxlist或任何其他名称的值与用于标记它的任何名称都没有关系。


*好了,你可以,通过使用一些深层次的“巨蟒巫术” ......你基本上要告诉Python阅片的源代码中调用printL(A_minus_B)并提取变量从那里的名字。通常情况下,你可能不应该这样做(不是因为你是初学者,而是因为它通常表明你设计的程序是错误的),但是调试是其中一种可能适用的情况。下面是做这件事:

import inspect, pprint 

def print_values(*names): 
    caller = inspect.stack()[1][0] 
    for name in names: 
     if name in caller.f_locals: 
      value = caller.f_locals[name] 
     elif name in caller.f_globals: 
      value = caller.f_globals[name] 
     else: 
      print 'no such variable: ' + name 
     # do whatever you want with name and value, for example: 
     print "****************************" 
     print name 
     print (" entries : "),len(value) 
     print value 
     print "****************************" 

美中不足的是,当你调用这个函数,你必须通过它的名字你想打印的变量,而不是变量本身的。所以你会打电话print_values('A_minus_B'),而不是print_values(A_minus_B)。您可以传递多个名称以将它们全部打印出来,例如print_values('A_minus_B', 'C_minus_D', 'foo')

+0

谢谢大卫。我应该如何设计这种类型的东西呢? “调用函数时,告诉我传递给该函数的参数的名称”。我想我可以做listDic = {“listA”:list_A,“listB”:list_A}然后调用printL(listDic(mylist)),并有printL显示mylist。这是不好的设计? – 2011-12-18 07:11:03

+0

这取决于,为什么你需要变量的名称? – 2011-12-18 07:32:36

+0

我有一个函数来打印我的列表的值(soe类型的调试),并且想打印出我传递给函数的列表的名字。字典的方法似乎有效。我有一个listDic = {“list_A”:listA,“list_B”:listB}我调用printL(“listX”),它打印“listX”,然后通过print listDic [listX]打印listX中的值。这是声音编码吗?非常感谢Thomas – 2011-12-18 16:20:14

0

替代的方式来做到这一点:

list_dict = {}  #creates empty dictionary 
list_dict['list_a'] = [1,2,3,4,5,6] # here you create the name (key) 
nice_name = 'list_b' 
list_dict[nice_name] = [7,8,9,10,11,12] # here you use already existing string as name (key) 

def list_info(ld): 
    for key in sorted(ld): 
     print "****************************" 
     print key 
     print " entries : " ,len(ld[key]) 
     print ld[key] 
     print "****************************" 

list_info(list_dict) 
相关问题