2017-07-25 119 views
2

reference manual它指出:加載模塊和初始化模塊之間的區別?

一個完整的Python程序是在最低限度初始化的環境中執行:所有內置和標準模塊可供選擇,但都沒有被初始化,除了sys(各種系統服務),builtins(內置函數,例外和無)和__main__

我不確定「初始化」是什麼意思。我始終認爲,如果它是在sys.modules加載和現在的模塊被初始化:

這是模塊的名稱映射到一個已加載模塊的字典。

很顯然,我錯了,因爲sys.modules包含許多其他模塊:

python -c "import sys; print(sys.modules.keys() - {'sys', 'builtins', '__main__'})" 
{'_stat', 'encodings.aliases', '_sitebuiltins', '_thread', 'io', '_weakrefset', 'genericpath', 'encodings.utf_8', 'codecs', 'os', '_weakref', '_codecs', '_frozen_importlib', '_io', '_frozen_importlib_external', 'os.path', '_warnings', '_bootlocale', '_signal', 'errno', '_imp', 'encodings.latin_1', 'sysconfig', 'marshal', 'encodings', 'usercustomize', 'site', 'posixpath', '_collections_abc', 'posix', '_sysconfigdata_m_linux_x86_64-linux-gnu', 'encodings.cp437', 'abc', 'zipimport', 'stat', '_locale'} 

什麼是初始化並加載模塊的區別?我在Python 3的

回答

4

自編寫文檔以來,語言初始化變得複雜得多。 (自從至少Python 1.4以來,它一直保持不變)。sys.modules中的所有模塊都已完全加載並初始化。

+0

看起來很奇怪,它沒有得到任何關注,因爲它被明確地鏈接在'import'的文檔中,[專門用於'module .__ spec__'](https://docs.python.org/3/ reference/import.html #__ spec__),它已經在最近更新了。 –

+0

注意擴大每個問題的「初始化和加載模塊之間的區別」? AFAIK初始化的模塊已經執行了[語句執行](https://docs.python.org/3.6/tutorial/modules.html#more-on-modules),而加載的模塊只能在符號表中使用。 – Alex

+1

@Alex:[import system reference](https://docs.python.org/3/reference/import.html#loading)將加載過程描述爲包含初始化,以「加載」和「初始化「是等同的。不過,我不希望完全一致的Python文檔,這些術語,特別是「加載」,應該在上下文中考慮,以確定文檔試圖說些什麼。例如,'sys.modules'包含了導入系統文檔使用該術語的意義上尚未完全加載的模塊。 – user2357112

-1

簡單來說:

import加載模塊到內存中。

當您在模塊中調用一個類並使用.__init__()函數以使屬於此模塊的類中的某些屬性得到更新時,此模塊將成爲初始化模塊。

請注意,當您使用模塊時,此過程隱式發生。

TL; DR

import some_module加載模塊, some_module.some_attribute/function初始化。

+0

這沒什麼意義。如果模塊沒有類,它會不會被初始化?我擔心,如果沒有消息來源,這只是你對最有可能用於特定原因的詞語的解釋。 –

+0

每個模塊都有一個內置的類。爲了證明這一點,請嘗試dir(模塊),你將永遠得到一本字典。那麼,對於「加載」和「初始化」沒有官方定義。這只是一個術語。 –

+0

你正在談論一個模塊中的類*,而不是模塊對象。即使您正在討論模塊對象,sys.modules中的模塊也會被初始化,但在參考手冊中沒有說明。在參考手冊中,對'sys','builtins'和'__main__'進行了明確的引用。 –

相關問題