【Python】import與from import真的是淺拷貝和深拷貝嗎
最近在準備面試,回頭看python基礎的過程中,遇到一些小問題。
模組的搜尋順序是:
- 當前程式所在目錄
- 當前程式根目錄
- PYTHONPATH
- 標準庫目錄
- 第三方庫目錄site-packages目錄
path 變數本質是一個列表,可以向path中新增模組所在的目錄:sys.path.append('/Users/KG/Desktop')
import與from import的區別
- import方式
import 方式匯入時,只是在當前檔案中建立了一個模組的引用,通過模組的引用來使用模組內的資料 ,對檔案內的資料,通過模組名都可以進行訪問。可以將 import 匯入方式理解成
模組匯入成功後,在使用模組過程中,如果被匯入的模組對資料進行了修改,那麼正在使用該模組的程式並不會修改。
就算重新匯入修改後的模組也不行,因為程式在匯入模組時,會將模組建立一個物件儲存到一個字典中,如果之前匯入過一次,再次匯入時就不會再建立這個物件。
可以通過 sys 模組下的 modules 屬性來檢視一個檔案中匯入過的模組。
解決辦法:使用 imp 模組下的 reload 函式重新載入模組
from imp import reload
reload(被修改的模組名)
一個疑問? ☞ import既然是淺拷貝,那為什麼原模組的內容發生改變,正在使用該模組的程式不會改變呢?這不是和淺拷貝矛盾嗎?!如果是我哪裡的思路錯誤,希望指出。
我在pycharm中進行了實驗,發現:原模組中內容發生改變,正在使用該模組的程式依然可以拿到最新的內容,即實時更新;
aa模組,如圖:
執行bb.py:
改變aa模組內容:
再次執行bb.py
然後又在終端中進行了嘗試,發現了上文所說的現象:
aa模組內容:
終端import匯入,進行測試:
改變aa模組原始檔內容:
重新匯入,沒有解決:
使用reload:
- from-import 方式
from-import 方式在匯入資料時,會將匯入模組中資料複製一份到當前檔案中,所以可以直接使用模組中的變數,函式,類等內容。
from-import 方式可以理解成深拷貝,被匯入模組中的資料被拷貝了一份放在當前檔案中。
注意:
1、在使用 from-import 方式匯入時,檔案內私有屬性 _xxx 形式的資料不會被匯入。
只有x可以使用,私有屬性_y和__z無法使用
2、在使用 from-import 方式匯入時,如果模組內和當前檔案中有識別符號命名重名,會引用命名衝突,當前檔案中的內容會覆蓋模組的資料
要使用私有屬性怎麼辦?
解決辦法:
使用__all__ 魔法變數
如果模組中存在__all__這個變數,那麼就按這個變數裡的內容進行匯入,沒有包含的不匯入。
如圖:
使用哪種方式匯入,需要根據實際情況考慮,從使用便利的角度,使用from-import,
從命名衝突的角度,使用 import。