You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:24:09