2

文件a.py

def f():
  pass

文件main.py

import a
print("f globals")
print(a.f.__globals__)

def g():
  pass

print("g globals")
print(g.__globals__)

a.f.__globals__比 有更多的元素g.__globals__。乍一看,内置函数和类型似乎在a.f.__globals__. 为什么这两个字典不一样?

4

1 回答 1

5

您正在查看模块名称空间。f()全局变量与全局变量不同,g()因为它们都存在于不同的模块中。

如果您使用vars()(for globals in main) 和vars(a)(for the globals of module a),您将看到相同的全局命名空间:

print(sorted(vars(a).keys() - vars()))
# prints ['__initializing__', 'f'], only `a` has `f` defined, the `__initializing__` value is a flag used by the import machinery
print(sorted(vars().keys() - vars(a)))
# prints ['a', 'g'], only `main` has imported `a` and defined function `g`

每个模块都有自己的命名空间,globals()不是解释器全局的,它们只是模块全局的。导入模块意味着您正在导入对该命名空间的引用,或者该命名空间中创建对该名称的引用。

从模块对象的数据模型文档中:

模块对象具有由字典对象实现的命名空间(这是__globals__模块中定义的函数的属性引用的字典)

在函数对象上:

__globals__:对保存函数全局变量的字典的引用——定义函数的模块的全局命名空间。

主脚本的__builtins__键仅指向__builtins__模块,在已扩展为字典的导入模块中。这些都是一回事,真的。

于 2013-05-29T17:51:59.307 回答