我无法弄清楚它是如何在引擎盖下工作的。 我有以下文件:
test.py
x = 20
def foo():
print x
test2.py
from test import foo
foo()
当我在test2.py中导入foo函数时,它是如何解析x的。据我所知,来自test import foo 的语句仅导入foo函数。
答案 0 :(得分:4)
函数保留对其模块全局变量的引用。 foo
有这样的参考:
>>> from test import foo
>>> foo.__globals__
{'x': 20, 'foo': <function foo at 0x102f3d410, ...}
当您导入内容时,Python会创建一个模块 object ;此对象存储在sys.modules
中,它充当该模块的全局命名空间。然后import
语句将“本地”模块中的名称绑定到该对象或该对象的属性。
函数引用相同的命名空间来查找定义它们的全局变量;它们基本上引用了相同的字典对象:
>>> import sys
>>> foo.__globals__ is sys.modules['test'].__dict__
True
答案 1 :(得分:0)
这一点,当函数记住它所定义的所有环境时,称为closure。