demo.py:
i = 1
def f():
j = 2
f()
test.py:
import dis
source = open('./demo.py').read()
co = compile(source, './demo.py', 'exec')
print(co.co_name)
dis.dis(co)
print("\n")
fCode = co.co_consts[1]
print(fCode.co_name)
dis.dis(fCode)
输出:
<module>
1 0 LOAD_CONST 0 (1)
3 STORE_NAME 0 (i)
3 6 LOAD_CONST 1 (<code object f at 0x022F5430, file "./demo.py", line 3>)
9 MAKE_FUNCTION 0
12 STORE_NAME 1 (f)
6 15 LOAD_NAME 1 (f)
18 CALL_FUNCTION 0
21 POP_TOP
22 LOAD_CONST 2 (None)
25 RETURN_VALUE
f
4 0 LOAD_CONST 1 (2)
3 STORE_FAST 0 (j)
6 LOAD_CONST 0 (None)
9 RETURN_VALUE
对于def f():这一语句,Python虚拟机先将函数f对应的PyCodeObject入栈,然后再MAKE_FUNCTION。
caseMAKE_FUNCTION:
v=POP();/*
code object */
x=PyFunction_New(v,f->f_globals);
Py_DECREF(v);
/*
XXX Maybe this should be a separate opcode? */
if(x!=NULL&&oparg>0){
v=PyTuple_New(oparg);
if(v==NULL){
Py_DECREF(x);
x=NULL;
break;
}
while(--oparg>=0){
w=POP();
PyTuple_SET_ITEM(v,oparg,w);
}
err=PyFunction_SetDefaults(x,v);
Py_DECREF(v);
}
PUSH(x);
break;
在相应代码中,将对应的PyCodeObject和帧的全局符号表指针传递给PyFunction_New函数,调用之,最后将返回值入栈。
在PyFunction_New函数中,创建一个PyFunctionObject,然后初始化相应的成员信息,返回之。
而对于函数f的调用,首先将函数名入栈,再执行CALL_FUNCTION:
caseCALL_FUNCTION:
{
PyObject**sp;
PCALL(PCALL_ALL);
sp=stack_pointer;
#ifdefWITH_TSC
x = call_function(&sp, oparg, &intr0, &intr1);
#else
x=call_function(&sp,oparg);
#endif
stack_pointer=sp;
PUSH(x);
if(x!=NULL)
continue;
break;
}
在这里,将栈顶指针和参数信息传递给函数call_function,然后恢复栈顶指针,将返回值入栈。
最后实际上是创建了一页帧,然后以帧作为活动环境,调用PyEval_EvalFrameEx函数。
f=PyFrame_New(tstate,co,globals,NULL);
if(f==NULL)
returnNULL;
fastlocals=f->f_localsplus;
stack=(*pp_stack)-n;
for(i=0;i<n;i++){
Py_INCREF(*stack);
fastlocals[i]=*stack++;
}
retval=PyEval_EvalFrameEx(f,0);
JasonLee 2011.08.27 19:52
分享到:
相关推荐
《Python学习笔记(干货) 中文PDF完整版.pdf》是一份全面且深入的Python学习资源,旨在帮助初学者和有经验的程序员进一步提升Python技能。这份资料覆盖了Python的多个核心概念,包括环境搭建、基本语法、数据类型、...
【Python核心笔记】深入浅出地探讨了Python这一强大且多用途的编程语言。Python以其简单易用且功能强大的特性,赢得了广大开发者的喜爱。它是一种解释型的高级编程语言,支持面向对象编程,同时也具备过程化编程的...
手把手教您如何使用python语言,创建OpenStack虚拟机。
在马哥教育的PYTHON相关基础笔记中,我们看到几个关键知识点: 1. **推荐书籍**:学习Python时,有几本经典教材值得参考,包括《Python Cookbook》、《Learn Python the Hard Way》、《Google's Python Class》以及...
本教程笔记涵盖了 Python 的基础知识点,包括变量、字符串、列表、元组、布尔类型、逻辑运算符、循环结构、列表访问、成员资格运算符、is 运算符、引用和拷贝、列表推导式、元组的使用、字符串的加法和乘法、格式化...
本篇学习笔记主要介绍了Python中关于变量指向函数、高阶函数以及特殊高阶函数map()、reduce()、filter()和sorted()的使用方法和原理。 首先,变量在Python中不仅可以指向基本数据类型,还可以指向一个函数名。这...
'千锋python基础教程:7、装饰器&偏函数与作用域与异常处理与文件读写' 千锋python基础教程:8、os与窗口控制与内存修改与语言 第二章前端基础 1、html&css;基础 2、html&css;提升 3、JavaScript基础 4、...
在详细解释函数定义、形式参数和实际参数之后,笔记还指导读者如何理解变量的作用域,以及如何在函数中使用返回值。类型转换则是处理不同类型数据间转换的重要概念,也是编程中不可或缺的一部分。 皮大庆的这份学习...
### Python学习笔记知识点详解 #### 一、Python简介与特性 **标题与描述解析:** "Python学习笔记.pdf" 的标题直接指出了文档的主题——Python的学习资料,而描述的重复表明该文档的主要内容即为Python的学习笔记...
在Python的基础部分,笔记介绍了变量和简单类型,包括Python的关键字和内置函数,特别是数值类型如整型。变量是程序中存储数据的标识符,而简单类型如整型、浮点型、布尔型等是Python的基础数据结构。Python是动态...
- **编译**:尽管Python通常被认为是解释型语言,但它实际上在运行时会先将源代码编译成字节码,然后由Python虚拟机执行这些字节码。这种中间步骤提高了Python的执行效率。 - **执行**:Python程序的执行过程涉及到...
这篇“Python入门笔记”旨在帮助初学者快速掌握Python的基础知识,通过实践操作来加深理解。 首先,Python的语法特点是它的一大亮点。Python代码强调可读性,遵循“缩进决定代码块”的原则,避免了大括号带来的视觉...
笔记中的基础代码部分还包含了对Python代码的编写规范,如文件开头使用`#--coding:utf-8--`指定文件编码为UTF-8,以及`print`函数的使用等。 通过这份笔记,学习者可以对Python的基础语法和数据结构有一个初步的...
通过这些笔记,你可以系统地学习Python的语法和其他基本问题,逐步建立起对Python编程的全面理解。 1. **基础知识.md** 这一部分介绍了Python的基本语法,包括变量的声明、数据类型(如整型、浮点型、字符串、布尔...
本笔记详细记录了Python的学习要点,包括变量和简单类型、数据结构、函数和类、异常处理、模块和包、文件操作、数据库编程、并发编程、网络编程、数据可视化和网络爬虫等多个方面,是学习Python不可多得的参考资料。...
本篇Python笔记将从多个方面对Python进行介绍,包括其安装过程、基本编程概念、数据类型、基本语句、控制结构、函数使用等,旨在帮助初学者快速入门并掌握Python的基本知识。 一、安装Python 要使用Python,首先...
廖雪峰Python笔记总结 廖雪峰Python笔记涵盖了Python语言的基础知识,从最基本的概念到模块部分,不包括函数式编程。...该笔记对Python语言的基础知识进行了详细的总结和解释,对于初学者和中级开发者都非常有用。
6. 安装Python:在虚拟机中安装Python解释器,可以选择官方提供的安装包或使用包管理器(如apt-get或yum)。 7. 创建Python环境:在虚拟机中,可以使用venv或conda创建Python虚拟环境,隔离项目依赖。 8. 部署Python...