gpt4 book ai didi

python - 标识符中的Unicode下标和上标,为什么Python认为XU == Xᵘ == Xᵤ?

转载 作者:太空狗 更新时间:2023-10-29 17:45:42 25 4
gpt4 key购买 nike

Python 允许 unicode 标识符。我定义了 Xᵘ = 42,期望 XUXᵤ 导致 NameError。但实际上,当我定义 Xᵘ 时,Python(默默地?)将 Xᵘ 转换为 Xu,这让我觉得有点不符合 pythonic做。为什么会这样?

>>> Xᵘ = 42
>>> print((Xu, Xᵘ, Xᵤ))
(42, 42, 42)

最佳答案

Python 将所有标识符转换为它们的 NFKC normal form ;来自 Identifiers section引用文档:

All identifiers are converted into the normal form NFKC while parsing; comparison of identifiers is based on NFKC.

上标和下标字符的 NFKC 形式都是小写的 u:

>>> import unicodedata
>>> unicodedata.normalize('NFKC', 'Xᵘ Xᵤ')
'Xu Xu'

所以最后,您只有一个标识符,Xu:

>>> import dis
>>> dis.dis(compile('Xᵘ = 42\nprint((Xu, Xᵘ, Xᵤ))', '', 'exec'))
1 0 LOAD_CONST 0 (42)
2 STORE_NAME 0 (Xu)

2 4 LOAD_NAME 1 (print)
6 LOAD_NAME 0 (Xu)
8 LOAD_NAME 0 (Xu)
10 LOAD_NAME 0 (Xu)
12 BUILD_TUPLE 3
14 CALL_FUNCTION 1
16 POP_TOP
18 LOAD_CONST 1 (None)
20 RETURN_VALUE

上面对编译后的字节码进行反汇编表明,标识符在编译时已经规范化;这发生在解析期间,在创建编译器用来生成字节码的 AST(抽象解析树)时,任何标识符都会被规范化。

标识符被规范化以避免许多潜在的“相似”错误,否则您最终可能会同时使用 find()(使用 U+FB01 LATIN SMALL LIGATURE FI 字符后跟 ASCII nd 个字符)和 find() 并想知道为什么您的代码有错误。

关于python - 标识符中的Unicode下标和上标,为什么Python认为XU == Xᵘ == Xᵤ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48404881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com