函数中的locals()vs globals()

时间:2019-10-27 04:19:23

标签: python python-3.x scope local-variables

在以下包装函数中:

def info(self):
    a = 4
    def _inner():
        b = 5
        print ('LOCALS',locals())
        print ('GLOBALS', globals())
    _inner()

它将在python3.6中打印以下内容:

LOCALS {'b': 5}
GLOBALS {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'info': <function info at 0x1029d3598>}

为什么a locals()中不包含自由变量_inner?在文档中显示:

  

locals()

     

更新并返回代表当前本地符号表的字典。 在功能块中调用locals()而不是在类块中调用自由变量

此外,类变量是否总是对locals()隐藏?例如:

class X:
    b = 2
    def info(self):
        a = 3
        print (locals())

>>> X().info()
{'a': 3, 'self': <__main__.X object at 0x102aa6518>}

1 个答案:

答案 0 :(得分:2)

返回了自由变量,文档没有错……但是,如果内部函数中使用了内部函数,则仅对内部函数存在一个自由变量。否则,它不会加载到本地范围内。尝试在b += a之后添加一个简单的b = 5,您将按照预期的方式看到LOCALS {'b': 9, 'a': 4}的印刷。

对于类(和实例)变量,上面的内容同样适用,但有一个警告:必须通过self(或cls)对象访问这些变量,这将是而是显示在locals()中。