首页 > 解决方案 > Python 如何知道所有这些 π 的变体都是同一个变量名?

问题描述

Unicode 标准中有(至少)3 个希腊字母 pi 的变体,具有不同的代码点。但是,如果我将其中任何一个作为标识符分配给 Python 对象,我也可以使用其他任何一个:

In [1]: π = 3.14
In [2]: print(π)  # \u03c0
3.14

In [3]: print()  # \U0001d6d1
3.14

In [4]: print()  # \U0001d70b
3.14

Python 怎么知道这些名字是一样的?

标签: python-3.xunicode

解决方案


正如原始 PEP3131解释的那样:

所有的标识符在解析的时候都被转换成正常形式的NFKC;标识符的比较基于 NFKC。

这也包含在文档的标识符和关键字部分中。

所以:

In [58]: pis = ["\u03c0", "\U0001d6d1", "\U0001d70b"]

In [59]: pis
Out[59]: ['π', '', '']

In [60]: [ord(pi) for pi in pis]
Out[60]: [960, 120529, 120587]

In [61]: import unicodedata

In [62]: [unicodedata.normalize('NFKC', pi) for pi in pis]
Out[62]: ['π', 'π', 'π']

In [63]: [ord(unicodedata.normalize('NFKC', pi)) for pi in pis]
Out[63]: [960, 960, 960]

推荐阅读