K = 'K'
= ''
= ''
= ''
= ''
= ''
ᴷ = 'ᴷ'
assert K == == == == == ᴷ
print(f'{K=}, {=}, {=}, {=}, {=}, {=}')
并打印输出
K='ᴷ', ='ᴷ', ='', ='ᴷ', ='ᴷ', ='ᴷ'
我知道 https://peps.python.org/pep-3131/ ,并阅读了有关标识符的Python文档 https://docs.python.org/3/reference/lexical_analysis.html#identifiers ,但没有找到任何提示解释经验丰富的行为。
因此,我的问题是:如果将新值分配给其中一个标识符,那么为什么所有其他视觉上不同的标识符的值不会改变?
更新:考虑到当前可用的评论和答案,需要进一步解释我对问题的满意答案的期望:
关于比较标识符名称背后的NFKC转换的提示有助于理解为什么出现了经验丰富的行为,但是...它仍然让我有一个问题开放,即为什么选择在不同的情况下使用不同的Unicode字符串比较方法?它们出现的上下文?
与字符串字面量相比,指定标识符名称的相同字符串之间的比较方式显然有所不同。
我仍然需要了解什么才能看到Unicode字符串表示Python标识符名称的方式不同于表示字符串字面量的Unicode字符串之间不进行相同比较的深层原因?
如果我理解正确,Unicode具有使用一个代码点表示复杂字符或使用适当的基本字符及其修改器表示多个代码点的模糊规范的可能性。然后,Unicode字符串的规范化是试图在首次引入这种歧义可能性时解决引起混乱的方式。但是,这是对Unicode可视化工具(如查看器和编辑器)产生影响最大的Unicode特定内容。使用将字符串表示为大于255的整数值列表(Unicode代码点)的编程语言实际上是另一回事,不是吗?
以下是进一步尝试找到更好的问题措辞:
创建两个不同的Unicode字符串最终被认为不同的可能性的优势是什么,如果它们用作Python标识符的名称?
实际功能是我认为由于破坏的WYSIWYG能力而导致不合理行为背后的功能是什么?
以下是更多的代码,说明正在发生的情况并演示源自相同字符串的字符串文字和标识符名称之间的比较差异:
from unicodedata import normalize as normal
itisasitisRepr = [ char for char in ['K', '', '', '', '', '', 'ᴷ']]
hexintasisRepr = [ f'{ord(char):5X}' for char in itisasitisRepr]
normalizedRepr = [ normal('NFKC', char) for char in itisasitisRepr]
hexintnormRepr = [ f'{ord(char):5X}' for char in normalizedRepr]
print(itisasitisRepr)
print(hexintasisRepr)
print(normalizedRepr)
print(hexintnormRepr)
print(f"{ 'K' == '' = }")
print(f"{normal('NFKC','K')==normal('NFKC','') = }")
print(ᴷ == , 'ᴷ' == '') # gives: True, False
提供:
['K', '', '', '', '', '', 'ᴷ']
[' 4B', '1D542', '1D6B1', '1D50E', '1D576', '1D4DA', ' 1D37']
['K', 'K', 'Κ', 'K', 'K', 'K', 'K']
[' 4B', ' 4B', ' 39A', ' 4B', ' 4B', ' 4B', ' 4B']
'K' == '' = False
normal('NFKC','K')==normal('NFKC','') = True