None
S
sadscv
发布于
当我们调用一个函数时,会在栈空间(内存中的某片区域)建立一个栈框架(stack frame), 存储包括编译后的代码,和一些相关变量等数据。若这个函数是某个函数的子函数,栈空间还存有指定的返回地址。当函数执行完毕后,将结果返回相应地址,并释放该栈框架所占用内存。
闭包:
def make_printer(msg):
def printer():
print
msg
return printer
printer = make_printer('Foo!')
printer()
当我们调用make_printer时,先按规则建立好栈空间,执行其中代码,此时发现当前函数(make_printer)中有一个子函数(printer)引用了当前函数中local作用域下的本地变量。此时则在栈空间中新建一个栈框架,将其中的代码存入,并存入
参考资料:
namespace与scope详细:
http://python.jobbole.com/81367/
函数调用过程:
https://www.cs.ucsb.edu/~pconrad/cs8/topics.beta/theStack/06/
闭包的研究:nonlocal关键字及闭包初级分析。
http://linluxiang.iteye.com/blog/789946
http://blog.csdn.net/marty_fu/article/details/7679297
obj.closure____的内容,总结的很好但掩盖了全部细节:
http://stackoverflow.com/questions/14413946/what-exactly-is-contained-within-a-obj-closure
闭包实现的总结,比较精炼
http://www.cnblogs.com/hackerl/p/5985102.html
主要看CALL_FUNCTION一段。
http://eli.thegreenplace.net/2012/03/23/python-internals-how-callables-work/
函数调用源码分析,非常友好地展现了绝大部分过程,还是中文的,推荐指数5颗星。
http://www.jianshu.com/p/d00108741a18
细节细节,底层底层,看到这里已经是终点
阅读 2
评论 0