【问题标题】:Can I get a list of the variables that reference an other in Python 2.7?我可以获得引用 Python 2.7 中其他变量的变量列表吗?
【发布时间】:2013-07-11 09:17:33
【问题描述】:

想象一下我有:

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

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

我知道有is 来测试对象是否相同,但我只是想要一种快速获取名称的方法。

【问题讨论】:

  • 强制性问题:为什么?

标签: python variables pointers reference


【解决方案1】:

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

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 是全局的,而其他的则是本地上下文的副本。

关于你的第二个问题:

还有一个像 points_to(Y) 这样返回 'X' 的函数?

同样的功能。 XY 都只是指向同一个对象的名称,在本例中是一个列表。 XY 没有区别,Y 不指向 XY 指向 [0,1]X 也是如此。

【讨论】:

  • +1 这显然是比我更好的答案,我删除了我的解决方案。 :)
猜你喜欢
  • 2020-08-06
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 2020-03-12
相关资源
最近更新 更多