我发现,通过print
直接打印带有家庭表情符号的字符串时,以及当它在列表中时,我发现了一些意想不到的差异。以下程序
family = '👨👩👧👧'
print(family)
print([family])
输出
👨👩👧👧
['👨u200d👩u200d👧u200d👧']
当我期望它输出时
👨👩👧👧
['👨👩👧👧']
多字符字形的另一种情况
man_with_skin_tone_modifier = '👨🏿'
print(man_with_skin_tone_modifier)
print([man_with_skin_tone_modifier])
输出如我预期:
👨🏿
['👨🏿']
这是为什么呢?
上下文:我在为 https://stackoverflow.com/a/49930688/1319998 写答案时发现了这一点,它在OS X上使用Python 3.6.5。
如注释中所述,区别在于print(family)
调用str.__str__
方法,而print([family])
调用str.__repr__
,后者转义不可打印的 unicode 字符。
-
print
函数使用str
转换其(非关键字)参数。 -
对容器调用
str
(通常)调用其项目repr
。主要是因为容器内的字符串太容易干扰容器本身的呈现(例如换行符)。在Python 3发布时提出了改变这一点的PEP,但很快就被拒绝了。 -
对字符串调用
repr
会转义任何不可打印的字符(但从 Python 3 开始,保留其他非 ASCII Unicode 字符):请参阅 PEP-3138 和 str.isprintable 的描述
如果字符串中的所有字符都可打印或字符串为空,则返回 true,否则返回 false。不可打印字符是指在 Unicode 字符数据库中定义为"其他"或"分隔符"的字符,ASCII 空格 (0x20) 除外,该空格被视为可打印。(请注意,此上下文中的可打印字符是在字符串上调用 repr() 时不应转义的字符。它与写入 sys.stdout 或 sys.stderr 的字符串的处理无关。
CPython实现可以在这里找到(搜索unicode_repr函数)。