原文: 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的全局命名空间中定义的变量。