📝 配套习题(24 题)
在Python中,type是所有类型的元类,而object是所有类的基类。关于类型系统,以下描述正确的是:
在Python中,当访问 obj.attr 时,属性查找的正确顺序是:
Python的LEGB规则定义了变量查找顺序:Local→Enclosing→Global→Builtin。在字节码层面,这四种作用域分别使用什么指令进行访问?
在Python导入系统中,sys.meta_path 列表中存放的是什么?其执行顺序是怎样的?
Python解释器启动时,Py_Initialize()函数执行的主要初始化顺序是什么?
Python虚拟机在执行字节码时,每个栈帧(Frame)对象包含哪些核心组件?
在Python C API中,所有Python对象都以PyObject结构体为基础。PyObject包含哪两个核心成员?
关于Python闭包的内部实现,以下说法正确的有:
当执行 import mypackage.mymodule 语句时,Python导入系统会执行哪些操作?
Python中函数作为描述符参与方法绑定,以下关于描述符调用机制的说法正确的有:
关于Python属性查找链中的描述符,以下说法正确的有:
在Python中,关于bound method和function的区别,以下描述正确的是:
关于Python解释器启动过程中site模块的作用,以下说法正确的有:
Python的PyTypeObject结构体定义了类型的各种行为,以下哪些是其重要成员?
关于Python字节码执行引擎,以下说法正确的有:
在C/C++程序中嵌入Python解释器,需要执行哪些必要步骤?
Python解释器执行一个脚本的完整流程:首先解释器调用Py_Initialize()进行初始化,然后使用PyRun_String()或PyRun_File()执行代码。代码首先被____________转换为token流,然后由____________构建AST抽象语法树,接着编译器将AST转换为____________(Code Object),最后虚拟机执行字节码生成结果。执行完成后调用Py_Finalize()清理资源。
Python虚拟机的核心执行循环是一个无限循环,每次迭代从当前栈帧的____________中读取下一条字节码指令。指令指针f_lasti记录当前执行位置。执行指令后,根据指令类型可能会操作值栈、修改局部变量、或跳转到其他位置。当执行到____________指令时,当前栈帧的返回值被压入调用者的值栈,当前栈帧从调用栈中弹出,执行权返回给____________。
在Python属性查找机制中,当访问一个属性时,__getattribute__方法会被首先调用。如果该方法在查找过程中遇到数据描述符,则会调用描述符的____________方法;如果属性在实例字典中找到且没有数据描述符拦截,则直接返回该值。只有当__getattribute__抛出____________异常时,Python才会尝试调用____________方法作为兜底处理。
在CPython中,每个Python对象都以对象头开始。定长对象(如int、float)使用PyObject_HEAD宏,包含____________(引用计数)和____________(类型指针)。变长对象(如list、str、tuple)使用PyVarObject结构,额外包含____________字段表示元素数量。这些结构确保了Python对象的统一内存布局,使得PyObject*指针可以指向任何Python对象。
Python的Code Object包含多个与作用域相关的属性。co_varnames存储____________名列表(包括参数);co_cellvars存储需要被嵌套函数捕获的变量名(即会放入____________对象的变量);co_freevars存储从外层函数捕获的变量名。在栈帧中,这些变量存储在f_localsplus数组的不同区域:局部变量在快速槽位、cell变量在cellvars区、freevars在____________区。
Python的PathFinder是默认的元路径查找器之一,它通过遍历____________列表来查找模块。对于每个路径条目,PathFinder会调用sys.path_hooks中注册的____________来创建对应的路径条目查找器。如果路径是目录,最终会使用____________来搜索.py、.pyc等文件。
在Python C API中,内存管理采用引用计数机制。增加引用计数使用____________宏,减少引用计数使用____________宏。当引用计数降为0时,对象会被立即回收。在多线程环境中,Python使用____________(全局解释器锁)来保护引用计数的线程安全,确保同一时刻只有一个线程执行Python字节码。
Python的特殊方法(如__add__、__len__)查找机制与普通属性查找不同。特殊方法查找会绕过实例字典,直接在类型对象上查找。例如len(obj)实际调用的是____________,而不是obj.__len__。这种设计是为了确保特殊方法的调用一致性,防止实例字典中同名属性的干扰。对于内置类型,特殊方法可能定义在____________的实现中,Python会直接调用对应的C函数,如list.__len__对应____________槽位。