为什么在Python中print返回\\而不是转义字符\?

4
下面的代码打印出以下这个表情: :
print('\U0001F602')
print('{}'.format('\U0001F602'))

然而,如果我像下面这样使用\,它会打印\U0001F602
print('\{}'.format('U0001F602'))

为什么print('\{}'.format())会返回\\而不是转义字符\

我在这里查看过并且也在谷歌上搜索过,但未找到合适的答案。


1
'\U0001F602' 在编译时被计算,以 \U 开头的字符串字面量对于编译器具有特殊意义。 '\{}'.format('U0001F602') 在运行时被计算(而且应该使用转义反斜杠写成 `'\{}'.format('U0001F602')')。 - Matthias
参见 Python 中字符串中的转义序列处理,解决将实际反斜杠后面跟大写字母 U 等转换成表情符号的问题。至于实际提问的问题,很简单:\{不是有效的转义序列,Python 通过将反斜杠视为字面量来处理它。现在链接到的重复内容是我能找到的最好的这个问题的参考资料 - 在较新版本的 Python 中,您会收到此代码的警告信息。 - Karl Knechtel
警告默认是禁用的;您需要使用“-Wd”标志才能让Python看到这一点。 - Karl Knechtel
2个回答

6

参考字符串和字节字符串,当Python在编译程序时在字符串文字中看到反斜杠时,它会查看下一个字符以查看接下来的字符如何转义。在第一种情况下,下一个字符是U,因此Python知道这是Unicode转义。在最后一种情况下,它看到{,意识到没有转义,只出现反斜杠和那个{字符。

print('\{}'.format('U0001F602')) 中,有两个不同的字符串文字 '\{}''U0001F602'。第一个字符串文字将在运行时使用 .format 解析,但结果并不是字符串文字 - 它是一个复合值。


1
>>> print('\{}'.format('U0001F602'))
\U0001F602

这是因为你将 {} 作为参数传递给 .format 函数,它只会填充花括号内的值。同时它会打印单个 \ 而不是双 \。

你提到它打印的是单个 \ 而不是双个 "。那么为什么 ('\{}'.format('U0001F602')) == ('\\{}'.format('U0001F602')) 返回 True 呢? - AfterFray
你使用了 '==' 运算符,该运算符检查 LHS = RHS 是否成立,如果是,则返回 true,并且两者返回相同的结果。 - Satyam Shankar
就理解为这样, - Satyam Shankar
当您使用 \ 时,它会认为第一个反斜杠是转义序列的开始,然后 \ 将打印一个 \,而单个 \ 则被视为字符串。 - Satyam Shankar
反斜杠的主要作用是转义字符。"\n"并不是后面跟着一个"n"的反斜杠,而是一个换行符,"\t"是一个制表符,以此类推。如果你想在字符串中使用反斜杠本身,你需要对其进行转义:"\\"。但是为什么这里可以起作用呢?Python看到了转义字符并检查下一个字符是一个 {。现在\{不是一个有效的转义序列,所以Python会回溯并假设这个反斜杠不应该是转义序列的一部分,而是独立的反斜杠。 - Matthias
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接