为什么在Python中打印Unicode字符串列表时会显示u"xyz"格式?

1 投票
3 回答
915 浏览
提问于 2025-04-15 18:45

请注意以下行为:

a = u"foo"
b = u"b\xe1r"   # \xe1 is an 'a' with an accent
s = [a, b]

print a, b
print s
for x in s: print x,

结果是:

foo bár
[u'foo', u'b\xe1r']
foo bár

当我直接打印变量 ab 中的两个值时,我得到了我预期的结果;但是当我把字符串值放到一个列表里并打印时,我得到了不想要的 u"xyz" 这种形式;最后,当我用循环从列表中打印值时,我又得到了最开始的那种形式。有人能解释一下这个看起来奇怪的行为吗?我知道这背后可能有个好理由。

3 个回答

0

你会遇到这个问题是因为列表可以包含任意数量的元素,而且这些元素的类型可以混合。在第二种情况下,你不是在打印Unicode字符串,而是在打印整个列表——这和打印列表里的内容是完全不同的。

由于列表可以包含任何东西,所以你会看到u'foo'这种写法。如果你使用的是非Unicode字符串,你会看到'foo'而不是单纯的foo

1

在Python中,对象有两种方式可以变成字符串:简单来说,str()会生成人类能看懂的输出,而repr()则生成计算机能理解的输出。当你打印某个东西的时候,它会使用str()。

不过,列表的str()实际上是使用它里面元素的repr()。

7

当你打印一个列表的时候,你看到的是每个元素的 repr() 表示。其实,列表并不是特别适合直接打印,所以Python会尝试显示一些能代表它结构的东西。

如果你想以某种特定的方式来格式化它,你可以明确告诉Python你想要的格式,或者重写它的 __repr__ 方法。

撰写回答