CPython中推导式符号表内额外符号.0与_[1]的含义咨询
推导式符号表出现额外符号的原因
嘿,这个问题其实跟CPython处理推导式的底层逻辑有关!你在3.6版本里看到的.0和_[1],都是推导式被编译时自动生成的内部符号,不是你代码里的问题。
逐个拆解奇怪符号的作用:
.0:这是推导式对应的隐式嵌套函数接收的迭代器参数。CPython会把推导式(比如列表推导、集合推导)编译成一个隐藏的嵌套函数,外层的可迭代对象会被作为第一个参数传给这个函数,.0就是这个参数的内部标识名,对应你代码里for x in ...中的...部分。_[1]:这是底层用来临时存储单次迭代结果的变量。推导式每循环一次,会把当前迭代到的值存在这个临时变量里,再处理后加入结果集合,属于CPython实现推导式时的“幕后”占位符,完全是内部使用的。
为什么非推导式结构没这个问题?
像lambda x: y这类普通匿名函数,就是直接按你写的逻辑编译,没有底层自动生成的额外参数和临时变量,所以symtable只会列出你显式用到的x和y。
另外要注意,symtable的设计是展示Python编译过程中所有存在的符号,包括底层实现用的内部符号,而不是只展示用户自己定义的标识符——这也是推导式会多出这些符号的核心原因。
内容的提问来源于stack exchange,提问作者Arminius
相关产品推荐
相关产品推荐

