文件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__
. 为什么这两个字典不一样?
文件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__
. 为什么这两个字典不一样?
您正在查看模块名称空间。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__
模块,在已扩展为字典的导入模块中。这些都是一回事,真的。