函数中的 locals() 与 globals()

locals() vs globals() in function

在以下包装函数中:

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 不包含在 _inner locals() 中?从文档中说:

locals()

Update and return a dictionary representing the current local symbol table. Free variables are returned by locals() when it is called in function blocks, but not in class blocks.

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

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

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

自由变量被返回,文档没有错......但是自由变量只存在于内部函数中,如果它被使用的话。否则它不会加载到本地范围。尝试在 b = 5 之后添加一个简单的 b += a,您将看到 LOCALS {'b': 9, 'a': 4} 打印出来,就像您预期的那样。

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