Python 访问变量';姓名

Python 访问变量';姓名,python,variables,Python,Variables,我正在尝试访问一个变量的名称。例如,如果我调用一个函数来打印列表(printL) 要打印我的列表的名称“A\u减B”: 如何让函数打印“A\u减B”而不是调用函数printL(A\u减B)时使用的名称“name of list”?您不能。*详细原因在中讨论,但基本上Python在调用printL(A\u减B)时会做什么是将标记为A\u减B的值,并创建一个新标签xlist,该标签恰好引用相同的内容。从这一点开始,标签xlist与另一个标签A_减B完全没有联系,事实上,标签为A_减B或xlist的值

我正在尝试访问一个变量的名称。例如,如果我调用一个函数来打印列表(
printL
) 要打印我的列表的名称
“A\u减B”

如何让函数打印
“A\u减B”
而不是调用函数
printL(A\u减B)
时使用的名称
“name of list”

您不能。*详细原因在中讨论,但基本上Python在调用
printL(A\u减B)时会做什么
是将标记为
A\u减B
的值,并创建一个新标签
xlist
,该标签恰好引用相同的内容。从这一点开始,标签
xlist
与另一个标签
A_减B
完全没有联系,事实上,标签为
A_减B
xlist
的值或任何与用于标记它的任何名称没有联系的值


*好吧,你可以,通过使用一些深沉的“Python巫术”。。。基本上,您必须告诉Python阅读调用
printL(A_减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  "****************************"
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)

问题是,当调用此函数时,必须向其传递要打印的变量的名称,而不是变量本身。因此,您可以调用
print\u values('A\u-minus\u-B')
,而不是
print\u values(A\u-minus\u-B)
。您可以传递多个名称以将它们全部打印出来,例如
打印值('A\u减B','C\u减D','foo')

另一种方法:

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  "****************************"
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)

如果你告诉我们你用的是什么语言,那会有帮助的。对不起。这是Python2.7Duplicate:可能是@heltonbiker:ah的副本,捕捉得好。谢谢David。那我该怎么设计这种东西呢?“调用函数时,请告诉我传递给该函数的参数的名称”。我想我可以做listDic={“listA”:list_A,“listB”:list_A},然后调用printL(listDic(mylist)),让printL显示mylist。这是一个糟糕的设计吗?这取决于,为什么需要变量的名称?我有一个函数来打印列表的值(soe排序的调试),并希望打印出传递给函数的列表的名称。措辞法似乎奏效了。我有一个listDic={“list_a”:listA,“list_B”:listB}我称之为printL(“listX”),它打印“listX”,然后通过打印listDic[listX]来打印listX中的值。这是声音编码吗?非常感谢Thomas(我在这里这么做是因为在heltonbiker评论中链接为副本的问题中,这不是一个好的设计选择。)