Python __导入函数中的全局函数与主模块中函数的全局函数有很大不同

Python __导入函数中的全局函数与主模块中函数的全局函数有很大不同,python,Python,文件a.py: def f(): pass import a print("f globals") print(a.f.__globals__) def g(): pass print("g globals") print(g.__globals__) 文件main.py: def f(): pass import a print("f globals") print(a.f.__globals__) def g(): pass print("g globals")

文件a.py

def f():
  pass
import a
print("f globals")
print(a.f.__globals__)

def g():
  pass

print("g globals")
print(g.__globals__)
文件main.py

def f():
  pass
import a
print("f globals")
print(a.f.__globals__)

def g():
  pass

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

a.f.\uuuu globals\uuu
的元素比
g.\uuu globals\uuu
的元素多得多。乍一看,内置函数和类型似乎位于
a.f.\uuuu globals\uuuu
中。为什么这两个词典不同?

您正在查看模块名称空间。
f()
globals不同于
g()
globals,因为它们都生活在不同的模块中

如果使用(对于
main
中的全局变量)和
vars(a)
(对于模块
a
的全局变量),您将看到相同的全局名称空间:

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

从模块对象上的:

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

关于功能对象:

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


主脚本的
\uuuuuuuuuuuuuuu
键仅指向已扩展到字典中的导入模块中的
\uuuuuuuuuuu
模块。实际上,它们是相同的。

您正在查看模块名称空间。
f()
globals不同于
g()
globals,因为它们都生活在不同的模块中

如果使用(对于
main
中的全局变量)和
vars(a)
(对于模块
a
的全局变量),您将看到相同的全局名称空间:

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

从模块对象上的:

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

关于功能对象:

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


主脚本的
\uuuuuuuuuuuuuuu
键仅指向已扩展到字典中的导入模块中的
\uuuuuuuuuuu
模块。这些都是一样的,真的。

我不知道这是否真的回答了为什么导入函数的
\uuu全局\uuu
应该包括所有内置项。@Wooble:我显示了
f()
全局中没有像
g()
全局中那样的键,除了预期之外。我不知道这是否真的回答了为什么导入函数的
\uuu全局变量\uuu
应该包括所有的内置变量。@Wooble:我显示了
f()
全局变量中没有比
g()
全局变量中更多的键,而不是预期的键。