在运行时获取Python变量名

0 投票
4 回答
989 浏览
提问于 2025-04-17 00:13

这和在运行时获取变量或对象的名字是不同的。

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

简单来说,你是做不到的。

如果说得详细一点,虽然有点可能,但需要深入研究一下我认为是 gc 模块(一般情况下)或者使用 locals()globals()……不过,直接这样定义列表可能会更好:

myFunctionMap = [ ("someName", someName), … ]
for name, map in myFunctionMap:
    print name
    …
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

我对你如何使用这些信息不负任何责任。几乎可以保证它会在你最需要的时候失败。我不是在开玩笑。

0
  1. 你不能这样做。myFunctionMap 这个列表里存的是对象,而不是上面两行提到的名字。顺便说一下,把一个列表变量叫做“map”并不是个好习惯,因为“map”通常指的是字典。
  2. 变量名不能以数字开头,所以 2G_Functions3G_Functions 这样的名字是不能用的。
  3. 你可以通过创建一个字典,并给它起合适的名字来绕过这个问题。

例如:

myFunctionMap = {
  "2G_Functions" : { ... },
  "3G_Functions" : { ... },
}

for (name, functions) in myFunctionMap.iteritems():
  print name
  for func in functions.keys():
    print func

撰写回答