我相信,当大多数人找寻这样的解释时,绝不是想简单的看到为什么使用import或者from。本文是个人对import和from在底层到底做了什么的一些见解。
import
首先定义一个模块 spam.py
a = 37
def foo():
print(" I'm foo and a is %s " % a)
class Spam(object):
def testing(self):
print(" I'm Spam.tesing")
然后定义一个import1_1.py
import spam
print(spam)
print(globals()) #打印当前全局变量的名称
<module ‘spam’ from ‘C:\\…\\import_from\\spam.py’>
{‘__name__’: ‘__main__’, ‘__package__’: None, ‘__loader__’: <_frozen_importlib_external.SourceFileLoader object at 0x0000024B088DA2B0>, ‘__spec__’: None, ‘__annotations__’: {}, ‘__builtins__’: <module ‘builtins’ (built-in)>, ‘__file__’: ‘C:/…./import_from/import1.py’, ‘__cached__’: None,
‘spam’
: <module ‘spam’ from ‘C:\\….\\import_from\\spam.py’>}
import执行步骤:
1: 首先创建一个新的命名空间,用以存放模板里定义的所有对象。在spam(模块中)定义的函数和方法在使用global语句时将访问该命名空间。
2: 其次在新创建的命名空间中执行模块(spam)中所包含的代码
3: 最后调用函数中名称来
引用
模块命名空间,这个
名称与模块的名称相匹配。
import1_2.py
import spam
a = 10
print(spam.a) #调用spam模块内的a
print(spam.foo()) #调用spam模块内的函数foo()
print(a) #打印当前空间的a
print(globals())
###########
# 37
# I'm foo and a is 37
# 10
#{'__name__': '__main__', ......, 'spam': <module 'spam' from 'C:\\....\\import_from\\spam.py'>, 'a': 10}
import2.py
import spam
spam.a = 12
if __name__ =='__main__':
pass
main.py
import import2
import import1_2
if __name__ == '__main__':
pass
# 12 #在import2中修改了spam所引用的命名空间中的a的值(大家在尝试一下修改spam.a = 12 为a = 12)
# I'm foo and a is 12 #在import1_2中调用spam所引用命名空间中的函数foo()
# 10 #import1_2中a的值
from
from1.py
from spam import a
print(globals())
#{'__name__': '__main__', '__doc__': None,..., 'a': 37}
{‘__name__’: ‘__main__’, ‘__doc__’: None,…,
‘a’: 37
}
from语句用于将模块中的具体定义加载到当前命名空间。form语句相当于import,但它不会创建一个名称来引用新创建的模块命名空间,而是将对模块中定义的一个或多个对象的引用放到当前命名空间中.
from1_2.py
from spam import a
a = 10 #在本命名空间将a指向一个新的引用
print(a)
# 10
另外还有as 别名的用法,自行探索。