您好,登錄后才能下訂單哦!
這篇文章主要介紹Python程序運行原理的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
#othermodule.py def add(a, b): return a + b #mainrun.py import othermodule a = ['xiaoke', 1, 'python'] a = 'xiaoke string' def func(): a = -5 b = 257 print(a + b) print(a) if __name__ == '__main__': func() res = othermodule.add(1, 2) print(res)
Python 的內置函數 dir 可以用來查看一個命名空間下的所有名字符號。一個用處是查看一個命名空間的所有屬性和方法(這里的命名空間就是指類、函數、module)。
比如,查看當前的命名空間,可以使用 dir(),查看 sys 模塊,可以使用 dir(sys)
def func(),在字節碼指令中就是 MAKE_FUNCTION。
Python 是動態語言,def 實際上是執行一條指令,用來創建函數
(class 則是創建類的指令),而不僅僅是個語法關鍵字。
函數并不是事先創建好的,而是執行到的時候才創建的。
def func() 將會創建一個名稱為 func 的函數對象。
實際上是先創建一個函數對象,然后將 func 這個名稱符號綁定到這個函數上。
pyc 文件是 PyCodeObject 對象在硬盤上的表現形式。生成pyc文件:
python -m py_compile xx_module.py
創建時間,py文件比pyc文件新,則從新生成pyc
magic num做運行前版本檢測,版本不同從新生成pyc
PyCodeObject 對象
在運行期間,編譯結果也就是 PyCodeObject 對象,只會存在于內存中,而當這個模塊的 Python 代碼執行完后,就會將編譯結果保存到了 pyc 文件中,這樣下次就不用編譯,直接加載到內存中。
這個 PyCodeObject 對象包含了 Python 源代碼中的字符串,常量值,以及通過語法解析后編譯生成的字節碼指令。PyCodeObject 對象還會存儲這些字節碼指令與原始代碼行號的對應關系,這樣當出現異常時,就能指明位于哪一行的代碼。
import 指令是用來載入 module 的,如果需要,也會順道做編譯的事。但 import 指令,還會做一件重要的事情就是把 import 的那個 module 的代碼執行一遍,這件事情很重要。
Python 是解釋執行的,連函數都是執行的時候才創建的。如果不把那個 module 的代碼執行一遍,那么 module 里面的函數都沒法創建,更別提去調用這些函數了。
執行代碼的另外一個重要作用,就是在這個 module 的命名空間中,創建模塊內定義的函數和各種對象的符號名稱(也就是變量名),并將其綁定到對象上,這樣其他 module 才能通過變量名來引用這些對象。
Python 虛擬機還會將已經 import 過的 module 緩存起來,放到一個全局 module 集合 sys.modules 中。
這樣做有一個好處,即如果程序的在另一個地方再次 import 這個模塊,Python 虛擬機只需要將全局 module 集合中緩存的那個 module 對象返回即可。
以上是“Python程序運行原理的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。