Python Unicode字符串字面量:: '\u0391'和u'\u0391'有什么区别?

8
我正在使用Python 2.7.3版本,有人可以解释一下以下字面值之间的区别吗:
'\u0391'

并且:

u'\u0391'

以下是它们在 REPL 中的不同回显方式(特别是添加到 a1 的额外斜杠):

>>> a1='\u0391'
>>> a1
'\\u0391'
>>> type(a1)
<type 'str'>
>>> 
>>> a2=u'\u0391'
>>> a2
u'\u0391'
>>> type(a2)
<type 'unicode'>
>>> 

1
值得注意的是,在Python 3中,它们是相同的,并且都属于类型str,因为str现在是Unicode(但是b'\u0391'仍然等同于您的a1,只不过它是bytes类型)。 - abarnert
2个回答

9
您只能在Unicode字符串文字中使用Unicode转义符(\uabcd)。它们在字节字符串中没有意义。Python 2的Unicode文本(u'some text')是一种不同类型的Python对象,与python字节字符串('some text')不同。
这就像使用\t\T一样;前者在Python文字中有意义(被解释为制表符),而后者只表示反斜杠和大写字母T(两个字符)。
为了帮助理解Unicode和字节字符串之间的区别,请阅读Python Unicode HOWTO;我还可以推荐Joel Spolsky on Unicode article
注意:在Python 3中,相同的差异适用,但'some text'是Unicode字符串文字,而b'some text'是字节字符串语法。

如果你想要一个包含\u0391str,你需要选择一种编码方式,然后写出例如 u'\u0391'.encode('utf-8'),这将给你 '\xce\x91' - abarnert
如果u'一些文本'与'some text'不同,那么如何解释:u'a' == 'a',其结果为True? - Marcus Junius Brutus
@MarcusJuniusBrutus:当比较两个时,Python会自动解码为Unicode。您也可以将浮点数与整数进行比较,但这并不意味着它们是相同的类型。Python解码字节字符串以尝试测试;尝试u'\u0391' == u'\u0391'.encode('utf8'),您将收到警告(默认情况下从ASCII进行解码)。 - Martijn Pieters
@MarcusJuniusBrutus:同样的,1 == 1.0 是 True。相等并不一定意味着身份相同。 - abarnert
@MartijnPieters:是的,在你编辑回复之后,我删除了我的评论。 (但你确定它是来自ASCII而不是sys.getdefaultencoding()吗?当然,在2.7中通常是ASCII...) - abarnert
@abarnert: 没错;我不想让事情变得更加复杂,更不用说让人们认为设置默认编码是一件好事。在Python 2中,ASCII是默认编码,而且是的,当自动将Unicode转换为字节或反之时,会使用sys.getdefaultencoding() - Martijn Pieters

3
与 C 语言不同,Python 中的字符串可以用单引号(')或双引号(")括起来,除了三个双引号 """ 之外。
因此,'\u0391' 只是一个包含字母 \u0391 的字符串。在漂亮地打印该字符串时,\ 通过另一个 \ 进行转义。
相反,前面有一个 u 使得该字符串被视为 Unicode,所有转义都被评估。因此,u'\u0391' 被解释为“包含代码点 0391 的 Unicode 字符串”,与上述情况不同。

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