在运行时获取Python变量名称

时间:2011-08-23 22:40:06

标签: python

这与在运行时检索变量/对象名称不同。

2G_Functions={'2G_1':2G_f1,'2G_2':2G_f2}
3G_Functions={'3G_1':3G_f1,'3G_2':3G_f2}
myFunctionMap=[2G_Functions,3G_Functions]
for i in myFunctionMap:
    print i.??? "\n"
    for j in i:
            print str(j)

我希望输出如下所示。

2G_Functions:

2G_1

2G_2

3G_Functions:

3G_1

3G_2

如何在我的代码中获取字典变量的名称?我不知道我在循环中调用哪个来预先知道它的名字。

4 个答案:

答案 0 :(得分:3)

尽管对其他答案持悲观态度,但在这种特殊情况下,如果没有为G2_FunctionsG3_Functions标识的对象分配其他名称,则实际上可以执行您要求的操作(我冒昧地修复你的名字,这些名字不是有效的Python标识符。)话虽如此,这是一个可怕的,可怕的可怕的主意,你不应该这样做这样做,因为它最终会破裂,你会感到难过。所以不要这样做。的自从

以下内容与您尝试做的类似:

alpha = {'a': 1, 'b': 2}
beta = {'c': 2, 'd': 4}
gamma = [alpha, beta]
listOfDefinedLocals = list(locals().iteritems())
for x, y in listOfDefinedLocals:
    if y is gamma[0]: print "gamma[0] was originally named " + x
    if y is gamma[1]: print "gamma[1] was originally named " + x

这将输出:

gamma[1] was originally named beta 
gamma[0] was originally named alpha

对于您对此信息的处理方式,我不承担任何责任。它几乎可以保证在您需要时完全失败。我不是在开玩笑。

答案 1 :(得分:0)

  1. 你不能。 myFunctionMap列表包含对象,而不是上面2行附加的名称。顺便说一句,调用列表变量“map”不是一个好习惯,地图通常是字典。
  2. 您无法使用数字启动变量名称,因此2G_Functions3G_Functions将无效。
  3. 您可以通过创建具有适当名称的词典来回避问题
  4. e.g。

    myFunctionMap = {
      "2G_Functions" : { ... },
      "3G_Functions" : { ... },
    }
    
    for (name, functions) in myFunctionMap.iteritems():
      print name
      for func in functions.keys():
        print func
    

答案 2 :(得分:0)

简而言之,你不能。

如果你深入研究gc模块(针对一般情况)或者使用locals()globals(),那么有点可能......但是很可能更简单地定义列表如下:

myFunctionMap = [ ("someName", someName), … ]
for name, map in myFunctionMap:
    print name
    …

答案 3 :(得分:0)

尝试将列表列表改为字符串列表:

d2G_Functions={'2G_1':"2G_f1",'2G_2':"2G_f2"}
d3G_Functions={'3G_1':"3G_f1",'3G_2':"3G_f2"}
myFunctions=["2G_Functions","3G_Functions"]

for dict_name in myFunctions:
    print dict_name
    the_dict = eval("d"+dict_name)
    for j in the_dict:
        print str(j)

(我更改了原始变量的名称,因为python标识符不能以数字开头)