给出一般说明-假设您在模块中具有以下代码:
def outer(x=1): def inner(y=2): return x+y
当文件通过python通过python解析时
compile(),上面的文本将转换为字节码以说明如何执行 模块
。在模块字节码中,有两个“代码对象”,一个用于字节码,
outer()一个用于字节码
inner()。请注意,我说的是代码对象,而不是函数-
代码对象包含的内容仅比函数使用的字节码少,并且包含在编译时可能知道的任何信息-例如
outer()包含对的字节码的引用的字节码
inner()。
当模块实际加载时,通过评估与模块关联的代码对象,会发生的事情是为创建了一个实际的“功能对象”
outer(),并将其存储在模块的
outer属性中。函数对象充当字节码和调用该函数所需的所有上下文相关的东西(例如,应从哪个全局指令中提取等)的集合,而这些在编译时是未知的。在某种程度上,代码对象是函数的模板,该函数是用于在填充所有变量的情况下执行实际字节码的模板。
所有这些都
inner()还不涉及-作为函数-每次您真正开始调用时
outer(),即
inner()是 为外部调用
创建一个新的函数对象,该对象将已经创建的内部字节码对象绑定到全局列表,包括
x传递给该外部调用的as的值。可以想象,这非常快,因为不需要解析,只需使用一些指向其他已经存在的对象的指针来填充快速结构。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)