函数中的 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()
中的内容。
在以下包装函数中:
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()
中的内容。