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

想象一下,我有:

X = [0,1]

Y = X

Z = Y

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

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

最佳答案 是的,不.您可以获取全局变量列表:

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']

但是由于你不知道变量a,b,c和obj被定义在哪个上下文中,它再次无用了.作为示例,将a的定义移动到模块级别,您将得到以下结果:

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

其中一个是全球性的,而其他的则是当地情况的副本.

至于你的第二个问题:

And a function like points_to(Y) that returns ‘X’?

这是相同的功能. X和Y都只是指向同一对象的名称,在本例中是一个列表. X与Y没有区别,Y不指向X.Y指向[0,1],X也指向X.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值