我想知道,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}
。
没有内置的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}