Python globals()函数

原文: https://thepythonguru.com/python-builtin-functions/globals/


于 2020 年 1 月 7 日更新


globals()函数返回一个字典,其中包含在全局命名空间中定义的变量。 当从函数或方法中调用globals()时,它将返回表示该函数或方法所定义的模块的全局命名空间的字典,而不是从其调用处。

其语法如下:

  1. globals() -> dictionary

让我们举一些例子:

示例 1

module1.py

  1. #!/usr/bin/python3
  2. from pprint import pprint
  3. a = 100
  4. b = 4
  5. def foo():
  6. x = 100 # x is a local variable
  7. pprint(globals())

预期输出

  1. {'__builtins__': <module 'builtins' (built-in)>,
  2. '__cached__': None,
  3. '__doc__': None,
  4. '__file__': './module1.py',
  5. '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f699cab37f0>,
  6. '__name__': '__main__',
  7. '__package__': None,
  8. '__spec__': None,
  9. 'a': 100,
  10. 'b': 4,
  11. 'foo': <function foo at 0x7f699ca1e2f0>,
  12. 'pprint': <function pprint at 0x7f699ca1e6a8>}

试试看:

  1. from pprint import pprint
  2. a = 100
  3. b = 4
  4. def foo():
  5. x = 100 # x is a local variable
  6. pprint(globals())

以双下划线开头和结尾的名称是特殊的,并且由 Python 解释器定义。 我们在模块中定义的变量最后出现。

请注意,在foo()函数内部定义的局部变量x不包含在结果中。 要访问本地名称空间,请使用locals()函数。

示例 2

module1.py

  1. #!/usr/bin/python3
  2. from pprint import pprint
  3. a = 100
  4. b = 4
  5. def foo():
  6. x = 100 # x is a local variable
  7. pprint(globals())

module2.py

  1. #!/usr/bin/python3
  2. import module1
  3. x = 100
  4. y = 2
  5. module1.foo()

预期输出

  1. {'__builtins__': { ... }
  2. '__cached__': '/home/overiq/tmp/__pycache__/module1.cpython-35.pyc',
  3. '__doc__': None,
  4. '__file__': '/home/overiq/tmp/module1.py',
  5. '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7f17b12305c0>,
  6. '__name__': 'module1',
  7. '__package__': '',
  8. '__spec__': ModuleSpec(name='module1', loader=<_frozen_importlib_external.SourceFileLoader object at 0x7f17b12305c0>, origin='/home/overiq/tmp/module1.py'),
  9. 'a': 100,
  10. 'b': 4,
  11. 'foo': <function foo at 0x7f17b121d488>,
  12. 'pprint': <function pprint at 0x7f17b121d730>}

在这种情况下,globals()调用位于foo()函数内部。 当从module2调用foo()函数时,它将打印在module1的全局命名空间中定义的变量。