我非常喜欢在jupyter notebook中使用Python的一件事是,我可以使用一些Unicode符号来命名我的变量。例如,要使用希腊字母,我键入alpha
后跟制表符,然后得到α
。
我只是在使用粗体大写字母 T 时遇到了意外行为,bfT
后跟制表符,导致𝐓
.
实验如下。在单元格内(运行 Python 3(类型:
T = 1
𝐓 = 2
print(T) # prints 2
令我惊讶的是,第二行正在重新分配变量T
但我希望它与𝐓
不同。有人可以解释一下使用 Unicode 有什么好处吗?
我不知道它是否有帮助,但作为另一个实验,我可以看到与字符串相同的两个符号实际上是不同的
'T'.encode('utf8'), '𝐓'.encode('utf8') # (b'T', b'xf0x9dx90x93')
笔记本如何处理我的变量名称?
此行为在标识符(变量名称(的 python 语言规范中定义。 https://docs.python.org/3/reference/lexical_analysis.html#identifiers
2.3. 标识符和关键字
标识符(也称为名称(由以下词汇定义描述。
Python 中标识符的语法基于 Unicode 标准 附件UAX-31,详细说明和修改定义如下;参见 PEP 3131 了解更多详情。
[...]
解析时,所有标识符都转换为正常形式的 NFKC;标识符的比较基于 NFKC。
我们可以确认 T 和 T 在 NFKC 下是等价的,使用标准库 unicodedata 模块。
>>> import unicodedata
>>> unicodedata.normalize('NFKC','𝐓') == 'T'
True
因此,您应该避免在与唯一变量名称相同的范围内使用如此相似的 unicode 字符。
但是仍然有很多 unicode 字符是唯一的,可以安全地用于标识符:
>>> unicodedata.normalize('NFKC','💩λ')
'💩λ'