在以下包装函数中:
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>}
答案 0 :(得分:2)
返回了自由变量,文档没有错……但是,如果内部函数中使用了内部函数,则仅对内部函数存在一个自由变量。否则,它不会加载到本地范围内。尝试在b += a
之后添加一个简单的b = 5
,您将按照预期的方式看到LOCALS {'b': 9, 'a': 4}
的印刷。
对于类(和实例)变量,上面的内容同样适用,但有一个警告:必须通过self
(或cls
)对象访问这些变量,这将是而是显示在locals()
中。