1. import 實際上是python虛擬機器把當前的globals()和locals()傳進__builtins__.__import__內建函式了,所以實際上幹活的是那個__import__函式!
2. import對命名空間的影響
1)如果是python的內建模組,例如os模組。這些模組是隨著python虛擬機器啟動而載入進來的,但是並沒有暴露出來。我們可以通過dir()命令檢視當前命名空間
>>> dir()
['__builtins__', '__doc__', '__name__']
可以看到,並沒有看到像os,sys等模組。
但是我們如果執行import sys後,那就有了。
>>> import sys
>>> dir()
['__builtins__', '__doc__', '__name__', 'sys']
通過sys.modules這個字典(key: 模組名;value: 模組的路徑),我們可以檢視模組的資訊。再通過id函式,我們可以知道兩個sys模組是否為同乙個模組,如下:
>>> id(sys)
135708788
>>> id(sys.modules['sys'])
135708788
2)import只影響當前模組的命名空間
例如a.py裡面有一句import bb, 而bb.py裡面有一句import os,那麼可以這樣檢視
>>> import a
>>> dir()
['__builtins__', '__doc__', '__name__', 'a']
>>> dir(a)
['__builtins__', '__doc__', '__file__', '__name__', 'bb']
>>> dir(a.bb)
['__builtins__', '__doc__', '__file__', '__name__', 'os']
3. import package
首先合法的package必須含有乙個__init__.py檔案,package可以包含0個或多個module(py檔案)。假設aa資料夾中有test.py檔案和bb資料夾,bb資料夾裡面有c.py。那麼當import aa.bb.c的時候,究竟對命名空間產生什麼影響呢?
>>> import aa.bb.c
>>> dir()
['__builtins__', '__doc__', '__name__', 'aa']
>>> import sys
>>> for k,v in sys.modules.items():
... print k,'\t',v
...
aa
copy_reg __main__ site __builtin__ encodings encodings.encodings none
aa.bb.c
posixpath errno encodings.codecs none
encodings.latin_1 os.path _codecs stat zipimport warnings encodings.types none
userdict sys codecs readline types _types signal linecache posix encodings.aliases aa.bb
exceptions os
可以看到只是一句import aa.bb.c,卻把aa,aa.bb,aabb.c全部加入了當前命名空間。這種做法是為了防止重名的吧,因為如果不加字首的話,其他包裡面有重名的模組就不能識別了!原理是python現在當前命名空間查詢符號『aa』對應的object,然後再在它的命名空間查詢符號'bb',然後在bb的屬性(命名空間)裡面尋找c,所以,需要把aa,bb都載入進來。不過這些都是只載入一次的,不信的話,大家可以試一下再import aa.bb.d這樣的模組,同時預先在aa資料夾中的
__init__.py檔案中輸入print 『hello』,hello只在第一次import aa.bb.c的時候輸出!
4.from與import
1)例如:from aa import bb
>>> from aa import bb
>>> dir()
['__builtins__', '__doc__', '__name__', 'bb']
>>> import sys
>>> sys.modules['bb']
traceback (most recent call last):
file "", line 1, in keyerror: 'bb'
>>> sys.modules['aa.bb']
>>> bb
>>> aa.bb
traceback (most recent call last):
file "", line 1, in nameerror: name 'aa' is not defined
from import只是把import後面的名字引入了命名空間,讓我們可以更方便的 使用而已,但是內部實際上還是帶有模組名的。import 。。。as。。。也是同樣的道理了。
2)from 。。。import *
這種形式的import是不推薦的,因為很容易汙染命名空間。但是也可以了解一下。
首先如果package中的__init__.py檔案並沒有宣告__all__ 的值的話,from package import * 是沒有用的。因為python原始碼中的import_from_all這個函式估計會去讀__all__的值,然後再import。
而這種形式的import對命名空間的影響又是怎樣的呢?
答案是和import aa.bb.c那種一樣的。
python中的import介紹
coding changes the world accumulating makes yourself 感覺乙個 模組就是乙個物件啊,這個物件單元是專門用來處理某些需求的,作為乙個單獨模組引入 import語句作用 import語句作用就是用來匯入模組的,它可以出現在程式中的任何位置。import...
Python中import的使用
python中的import語句是用來匯入模組的,在python模組庫中有著大量的模組可供使用,要想使用這些檔案需要用import語句把指定模組匯入到當前程式中。import語句的作用 import語句作用就是用來匯入模組的,它可以出現在程式中的任何位置。import語句語法 使用import語句匯...
python中的import詳解
匯入也是一種啟動程式的方法。匯入從本質上講,就是載入另乙個檔案,並能夠讀取那個檔案的內容。更大的程式往往以多個模組檔案的形式出現。乙個模組檔案被設計成主檔案,或叫做頂層檔案 就是那個啟動後能夠執行整個程式的檔案 匯入必須找到檔案,將其譯成位元組碼,並且執行 模組往往就是變數名的封裝,被認作是命名空間...