我可以获得在Python 2.7中引用其他变量的变量列表吗?

时间:2013-07-11 09:17:33

标签: python variables pointers reference

想象一下我有:

X = [0,1]
Y = X
Z = Y

是否有像referenced_by(X)这样的函数返回类似['Y', 'Z']的内容?还有像points_to(Y)这样的函数返回'X'

我知道有is来测试对象是否相同,我只想快速获取名称。

1 个答案:

答案 0 :(得分:2)

是的,不。您可以获取全局变量的列表:

for name, val in globals().items():
    if val is obj:
        yield name

您还可以获取本地变量的列表:

for name, val in locals().items():
    if val is obj:
        yield name

但是,您将错过其他上下文中的所有变量,而不是函数的本地变量或模块的全局变量。您可以使用frame-magic在调用上下文中找到变量,但是您将无法找到任何其他模块的全局变量,例如。

我不知道你会用它做什么。

您也找不到任何引用该对象的属性,但属性不是变量,所以也许没问题。

您可以获取引用您的对象的所有对象。这将包括所有功能的全局和本地。但是在这种情况下你无法得到变量的名称。你可以做到

>>> import gc
>>> gc.get_referrers(obj)

获取引用对象obj的所有对象的列表。这又一次没用了。 : - )

如果你想要名字,你可以在引用者是字典或堆栈框架的情况下查找键:

import gc
import types

def find_ref_names(obj):
    for ref in gc.get_referrers(obj):
        if isinstance(ref, types.FrameType):
            look_in = [ref.f_locals, ref.f_globals]
        elif isinstance(ref, dict):
            look_in = [ref]
        else:
            continue
        for d in look_in:
            for k, v in d.items():
                if v is obj:
                    yield k


def main():
    a = "heybaberiba"
    b = a
    c = b

    print list(find_ref_names(b))

if __name__ == '__main__':
    main()

这将打印:

['a', 'c', 'b', 'obj']

但由于您不知道变量abcobj定义在哪个上下文中,因此它再次无用。作为示例,将a的定义移动到模块级别,您将得到以下结果:

['c', 'b', 'a', 'obj', 'a', 'a']

其中一个a是全局的,而其他X是本地情境的副本。

至于你的第二个问题:

  

像points_to(Y)这样的函数返回'X'?

这是相同的功能。 YX都只是指向同一对象的名称,在本例中是一个列表。 YY没有区别,X未指向Y[0,1]指向X,{{1}}也是如此。