提问者:小点点

有没有一种方法可以获取带有非局部变量的dict对象?


我想知道,Python中是否有一个函数返回一个包含在封闭函数中使用的非局部变量的判决对象?像vars()locals()的局部变量或global als()的全局变量。

更新:正如Bjorn所指出的,嵌套函数中实际使用的非局部变量包含在local列表中。关于3.2。3以下代码

>>> def func1():
...     x=33
...     def func2():
...             # Without the next line prints {}
...             print(x)
...             print(locals())
...     func2()
... 
>>> func1()

返回{'x': 33}


共2个答案

匿名用户

没有内置的nonlocals(),但您可以自己创建一个:

def nonlocals():
    import inspect
    stack = inspect.stack()
    if len(stack) < 3: return {}
    f = stack[2][0]
    res = {}
    while f.f_back:
        res.update({k:v for k,v in f.f_locals.items() if k not in res})
        f = f.f_back
    return res

如果我在你的程序上运行它,我会得到:

{'func2': <function func1.<locals>.func2 at 0x0000000002A03510>, 'x': 33}

匿名用户

公认的答案是非常非常错误的-f_back给出的是调用者,而不是词汇上的父范围!

Python是词汇作用域,而不是动态作用域!

您可以使用此处描述的方法完成所需操作:

def nonlocals():
    import inspect
    caller = inspect.currentframe().f_back
    return {k: v for k, v in caller.f_locals.items() if k in caller.f_code.co_freevars}

相关问题