python是如何實現生成器的

青穗黃發表於2018-10-29
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)
複製程式碼

函式呼叫過程:

  1. python.exe 會用一個叫做PyEval_EvalFramEx(C語言函式)去執行foo函式
  2. 首先會建立一個棧幀物件(位元組碼物件)
  3. 當foo呼叫了子函式bar,又會建立一個棧幀
  4. 所有的棧幀都是分配在堆記憶體上(不是在棧記憶體)(堆記憶體特性:不去釋放,會一直存在記憶體當中),這就決定了棧幀可以獨立於呼叫者存在

python是如何實現生成器的

生成器就使用了“棧幀都是分配在堆記憶體上”這一特性

python是如何實現生成器的

相關文章