python中的函数、生成器的工作原理
1.python中函数的工作原理 def foo(): bar() def bar(): pass python的解释器,也就是python.exe(c编写)会用PyEval_EvalFramEx(c函数)运行foo()函数 首先会创建一个栈帧(stack Frame),在栈帧对象的上下文里面去运行这个字节码。 import dis print(dis.dis(foo)) #打印字节码 可以尝试着去打印foo的字节码: 关于字节码的解释: LOAD_GLOBAL:首先导入bar这个函数 CALL_FUNCTION:执行bar函数 POP_TOP:从栈的顶端去把元素打印出来 LOAD_CONST:返回结果,这里没有return,就是None RETURN_VALUE:返回结果 打印bar的字节码: print(dis.dis(bar)) 这个字节码全局是唯一的,函数是全局唯一的,然后在函数里面会调用另外一个函数。 当foo调用函数bar,又会创建一个栈帧,然后将这个函数的控制权交给这个栈帧。 所有的栈帧都分配在内存中,它不是放在栈的内存上,而是放在堆的内存上,你不去释放它就会一直存在我们的内存当中。 这就决定了栈帧可以独立于调用者存在,比如就算函数不存在了,只要有指针指向bar这个栈帧,就可以对其进行控制。 (python中一切皆对象,栈帧也是对象,是一个字节码对象) import