我是 Python 的新手,有件事困扰了我很长一段时间。我在 Mark Lutz 的“学习 Python”中读到,当我们使用 from
语句导入模块中存在的名称时,它首先导入模块,然后为其分配一个新名称(即名称导入模块中存在的函数、类等),然后使用 del
语句删除模块对象。但是,如果我尝试使用 from
导入一个名称,该名称引用了本身未导入的导入模块中的名称,会发生什么情况?考虑以下示例,其中有两个模块 mod1.py
和 mod2.py
:
#mod1.py
from mod2 import test
test('mod1.py')
#mod2.py
def countLines(name):
print len(open(name).readlines())
def countChars(name):
print len(open(name).read())
def test(name):
print 'loading...'
countLines(name)
countChars(name)
print '-'*10
现在看看当我运行或导入 mod1 时会发生什么:
>>>import mod1
loading...
3
44
----------
在这里,当我导入并运行test
函数时,它运行成功,尽管我什至没有导入countChars
或countLines
,并且from
语句已经删除了 mod2
模块对象。
所以我基本上需要知道为什么这段代码可以工作,即使考虑到我提到的它不应该的问题。
编辑:非常感谢所有回答的人:)
最佳答案
每个函数都有一个 __globals__
属性,该属性包含对搜索全局变量和函数的环境的引用。
test
函数然后链接到 mod2
的全局变量。因此,当它调用 countLines
时,解释器将始终找到正确的函数,即使您在导入该函数的模块中编写了一个同名的新函数也是如此。
关于python - 关于 Python 导入的一些困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11958121/