在变量名称中使用Python时,无法区分某些Unicode字符

jmd*_*_dk 3 python unicode python-3.x python-unicode

问题

在编写Python 3代码时,我在变量名中使用Unicode文字使我很高兴。今天我有一个奇怪的错误,原来是由于Python无法区分变量??,如下面的短代码所示:

? = 'hello'
? = 'goodbye'
print(?)  # Prints 'goodbye'
Run Code Online (Sandbox Code Playgroud)

这是错误还是功能?如果是后者,我如何/在哪里可以找到以这种方式一起属于所有这些字符的集合?

进一步探索

??在字符串中使用时,不存在这种区别:

a = '?'
b = '?'
print(a == b)  # Prints False
Run Code Online (Sandbox Code Playgroud)

这使我确信这不是我的编辑器/终端的编码问题。

我们还可以使用以下unicodedata模块来确认Python完全了解我们正在处理的字符:

import unicodedata
print(unicodedata.name('?'))  # Prints 'GREEK SMALL LETTER RHO'
print(unicodedata.name('?'))  # Prints 'GREEK RHO SYMBOL'
Run Code Online (Sandbox Code Playgroud)

我在?(GREEK SMALL LETTER PHI)和?(GREEK PHI SYMBOL)之间发现了相同的行为。

Jos*_*Lee 5

2.3。标识符和关键字

解析时,所有标识符都转换为标准形式NFKC;标识符的比较基于NFKC。

>>> unicodedata.normalize('NFKC', '??')
'??'
Run Code Online (Sandbox Code Playgroud)