1. 程式人生 > >【Python】import與from import真的是淺拷貝和深拷貝嗎

【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。