为何Python的ast.parse会将拉丁字母µ转换为希腊字母µ?
问题解析:ast.parse对字符'µ'的编码转换原因
这两个视觉上几乎一致的'µ',其实是Unicode体系里的两个不同字符:
- 你最初定义的是微符号(Micro Sign),对应Unicode码点U+00B5,UTF-8编码为
b'\xc2\xb5',属于Latin-1 Supplement区块。 - AST解析后得到的是希腊小写字母Mu,对应Unicode码点U+03BC,UTF-8编码为
b'\xce\xbc',属于Greek and Coptic区块。
核心原因是Python在解析标识符时会自动执行Unicode NFKC规范化:
U+00B5和U+03BC是Unicode中的「兼容等价」字符——它们原本语义有区别(一个是单位符号,一个是希腊字母),但视觉表现一致。在标识符场景下,Python会通过NFKC规范化把这类兼容字符转换为标准形式,确保相同视觉/语义的字符被统一处理,避免因编码形式不同导致标识符被判定为不同名称。
你可以用unicodedata模块直接验证这个规范化过程:
import unicodedata mu_micro = 'µ' # U+00B5 mu_normalized = unicodedata.normalize('NFKC', mu_micro) print(mu_normalized.encode()) # 输出 b'\xce\xbc'
另外要注意:这个转换不是在ast.parse的代码里直接处理的,而是在Python的词法分析器(tokenizer)阶段完成的——当源代码被转换成token时,标识符就已经做了NFKC规范化,AST只是接收了处理后的结果,所以你查看ast.parse的代码找不到相关逻辑。
内容的提问来源于stack exchange,提问作者Carmel David
相关产品推荐
相关产品推荐

