我对如何在Python中确定范围和名称空间感到困惑。假设我的文件系统如下:
|-test1.py
-test2.py
每个文件的定义如下:
test1.py:
#!/usr/bin/python
def test1():
print('test1')
test2.py:
#!/usr/bin/python
from test1 import test1
def test2():
test1()
print('test2')
在python交互式解释器中,如果执行以下操作:
import test2
test2.test2()
,代码可以正常运行并给出以下结果:
test1
test2
从输出中,我们可以看到解释器可以正确识别test1()函数对象。在执行过程中导入test1.test1时,我感到困惑的是?该对象何时进入全球范围?
基于@Ziyad Edher的答案,我创建了一个维恩图来说明不同作用域之间的关系。假设解释器被第三个文件test3.py代替。其范围是如下:圆圈表示的范围中,File test3
指的是test3.py
,File test2
是指test2.py
,test2()
是指功能test2()
中test2.py
,test1()
指的是该函数test1()
的test1.py
。的范围test2()
没有test1()
,因此解释器将引用上级范围File test2
。范围File test2
具有test1()
,并将其调用。
Python模块导入和全局名称空间管理是一个非常广泛的主题,因此,我将把这个答案限于您看到的特定情况。
通常,Python的工作顺序非常顺畅。
import test2
,这将转到test2.py
本地目录中的文件,并在相同的Python环境中执行该文件。test2.py
,遇到了Python from test1 import test1
。test1.py
会做一些额外的事情,因为您是在模块中而不是模块本身中导入函数,但是一般而言,此时,test1
(函数)被置于当前作用域中。test2.test2()
,因为test2
已经在步骤2中导入了它,所以它也存在test2.test2
。因此,解释器跳至test2.test2
并被test1
调用,由于它在名称空间中(我们在步骤3中将其导入),因此不会引发任何错误,因此将调用第二个print语句。在底层,事情显然比这复杂一些,但这确实提供了Python如何处理这些内容的一般概述。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句