本文研究的主要是Python程序運行原理,具體介紹如下。


#othermodule.pydef add(a, b): return a + b#mainrun.pyimport othermodulea = ['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
在運行期間,編譯結果也就是 PyCodeObject 對象,只會存在于內存中,而當這個模塊的 Python 代碼執行完后,就會將編譯結果保存到了 pyc 文件中,這樣下次就不用編譯,直接加載到內存中。
這個 PyCodeObject 對象包含了 Python 源代碼中的字符串,常量值,以及通過語法解析后編譯生成的字節碼指令。PyCodeObject 對象還會存儲這些字節碼指令與原始代碼行號的對應關系,這樣當出現異常時,就能指明位于哪一行的代碼。
import 指令是用來載入 module 的,如果需要,也會順道做編譯的事。但 import 指令,還會做一件重要的事情就是把 import 的那個 module 的代碼執行一遍,這件事情很重要。
Python 是解釋執行的,連函數都是執行的時候才創建的。如果不把那個 module 的代碼執行一遍,那么 module 里面的函數都沒法創建,更別提去調用這些函數了。
新聞熱點
疑難解答