Python - 获取全局范围内对象的所有变量名称

时间:2017-08-14 10:33:20

标签: python

我将用一个例子来解释:

list_1 = [1, 2, 3]
list_2 = list_3 = list_1 # reference copy

print(magic_method(list_1))
# Should print ['list_1', 'list_2', 'list_3']

set_1 = {'a', 'b'}
print(magic_method(set_1))
# Should print ['set_1']

要求:返回指向同一引用的所有变量的名称。用python完全可以吗?

我正在思考迭代globals()locals()并等同id的问题。还有什么更好的吗?

2 个答案:

答案 0 :(得分:3)

对于全局变量,您可以这样做:

def magic_method(obj):
    return [name for name, val in globals().items() if val is obj]

如果您也想要本地名称,可以使用inspect模块:

def magic_method(obj):
    import inspect
    frame = inspect.currentframe()
    try:
        names = [name for name, val in frame.f_back.f_locals.items() if val is obj]
        names += [name for name, val in frame.f_back.f_globals.items()
                  if val is obj and name not in names]
        return names
    finally:
        del frame

然后:

list_1 = [1, 2, 3]
list_2 = list_1

def my_fun():
    list_3 = list_1
    list_2 = list_1
    print(magic_method(list_1))

my_fun()
>>> ['list_3', 'list_1', 'list_2']

答案 1 :(得分:-2)

这有效:

def magic_method(var):
     names = filter(lambda x: globals()[x] is var, globals().keys())
     return names

is执行参考比较。如果您使用的是Python3,请将list(...)添加到结果表达式中。