11

假设我有一个函数层次结构,我希望能够访问(而不是更改!)父范围。这是一个说明性示例。

def f():
    a = 2
    b = 1
    def g():
        b = 2
        c = 1
        print globals() #contains a=1 and d=4
        print locals() #contains b=2 and c=1, but no a
        print dict(globals(), **locals()) #contains a=1, d=4 (from the globals), b=2 and c=1 (from g)
        # I want a=2 and b=1 (from f), d=4 (from globals) and no c
    g()
a = 1
d = 4
f()

我可以f从内部访问 's 范围g吗?

4

1 回答 1

8

一般来说,你不能在 Python 中。如果您的 Python 实现支持堆栈帧(CPython 支持),您可以使用inspect模块检查调用函数的帧并提取局部变量,但我怀疑这是您想要解决的问题的最佳解决方案(无论可能是什么)。如果你认为你需要这个,你的设计中可能存在一些缺陷。

请注意, usinginspect将使您能够在调用堆栈中上升,而不是在词法范围的堆栈中。如果您g从中返回f(),则 的范围f将消失,因此根本无法访问它,因为它甚至不存在。

于 2012-07-19T12:56:05.627 回答