CPython 3推导式中".0"名称的来源及相关隐藏名称问询
CPython推导式中隐藏的
.0标识符问题解析 1. .0名称的CPython 3.10源码位置
在CPython 3.10中,.0这个隐藏名称的生成逻辑位于Python/symtable.c文件的_PySymtable_AddComprehension函数中(对应源码行号约为1868-1875)。该函数负责处理列表、生成器等推导式的符号表构建,会为推导式的外层迭代器生成格式为.n的隐藏标识符,其中首次迭代器的编号固定为0,因此最终生成.0并将迭代器对象绑定到这个名称上。
2. 其他类似隐藏名称与命名逻辑
- 是否存在
.1等其他编号名称?
存在。当使用嵌套推导式时,每一层的迭代器都会按顺序分配递增的编号,生成.1、.2等对应名称。例如嵌套列表推导式[x for y in [1,2,3] for x in range(y)]中,外层迭代器对应.0,内层迭代器对应.1,这些名称同样只能通过locals()访问。 - 为什么使用
.0格式?
采用以.开头的命名是为了避免和用户自定义的标识符冲突——Python语法规定合法标识符不能包含.,因此这些名称无法通过常规变量访问方式获取,只能通过符号表或locals()字典间接访问。编号从0开始是因为单层级推导式仅需一个迭代器,是最常见的场景,后续嵌套层级依次递增编号。 - 其他类似隐藏名称?
除了推导式迭代器的.n系列名称外,CPython编译器还会生成少量其他隐藏标识符,比如在异步推导式中也会遵循相同的.n命名规则生成迭代器名称;另外,在带async for的推导式这类特殊语法中,也会生成类似的以.开头的临时绑定名称,本质都是为了在不干扰用户命名空间的前提下,存储编译器处理语法糖所需的临时对象。
内容的提问来源于stack exchange,提问作者Blupper
相关产品推荐
相关产品推荐

