通过嵌套函数按父函数中定义的名称访问变量

时间:2019-07-11 07:28:27

标签: python scope

是否可以使用globals()locals()之类的名称来访问父函数中通过名称(即,作为字符串)定义的变量?

这两个示例均给出KeyError: 'x'

def f(): 
    x = 1 
    def g(): 
        print(globals()['x']) 
    g()

def f(): 
    x = 1 
    def g(): 
        print(locals()['x']) 
    g()

3 个答案:

答案 0 :(得分:3)

是有可能的,但是您正在使用Python,请不要这样做:

In [1]: import inspect

In [2]: def f():
   ...:     x = 1
   ...:     def g():
   ...:         print(inspect.currentframe().f_back.f_locals['x'])
   ...:     g()
   ...:

In [3]: f()
1

请不要。编写好的代码,而不是不好的代码。对于我们所有人。

答案 1 :(得分:1)

我不确定它是否有用,但是您可以通过检查封闭函数的堆栈框架(即深度1的框架)并从x字典中获得locals来做到这一点:

In [1]: import sys

In [2]: def f():
   ...:     x = 1
   ...:     def g():
   ...:         print(sys._getframe(1).f_locals['x'])
   ...:     g()
   ...:    
In [3]: f()
1

答案 2 :(得分:0)

为什么不像这样将值直接传递给子函数:

def f(): 
    x = 1 
    def g(parameter): 
        print(parameter) 
    g(x)