import inspect
frame = None
def foo():
bar()
def bar():
global frame
frame = inspect.currentframe()
foo()
print(frame.f_code.co_name)
caller_frame = frame.f_back
print(caller_frame.f_code.co_name)
複製程式碼
函式呼叫過程:
- python.exe 會用一個叫做PyEval_EvalFramEx(C語言函式)去執行foo函式
- 首先會建立一個棧幀物件(位元組碼物件)
- 當foo呼叫了子函式bar,又會建立一個棧幀
- 所有的棧幀都是分配在堆記憶體上(不是在棧記憶體)(堆記憶體特性:不去釋放,會一直存在記憶體當中),這就決定了棧幀可以獨立於呼叫者存在
生成器就使用了“棧幀都是分配在堆記憶體上”這一特性