我想你真正感到惊讶的是,打印单个字符串与打印字符串列表的作用不同——无论它们是否是 Unicode,这都是事实:
>>> hobby1 = u'Dizziness'
>>> hobby2 = u'Vértigo'
>>> hobbies = [hobby1, hobby2]
>>> print hobby1
Dizziness
>>> print hobbies
[u'Dizziness', u'V\xe9rtigo']
即使没有u
,你已经得到了那些额外的引号,更不用说反斜杠转义了。如果你尝试同样的事情str
字节字符串而不是unicode
字符串,你仍然会有引号和转义符(另外,如果你的源文件和终端有不同的编码,你可能会有 mojibake 字符......但忘记那部分)。
在Python中,每个对象都可以有两种不同的表示形式:最终用户友好的表示形式,str
,以及程序员友好的表示,repr
。对于字节字符串,这些表示是Painting
and 'Painting'
, 分别。对于 Unicode 字符串,它们是Painting
and u'Painting'
.
The print
声明使用str
, so print hobby1
打印出来Painting
,不带引号(或u
,如果是 Unicode)。
但是,那str
列表的使用repr
它的每个元素,而不是str
。所以,当你打印时hobbies
,每个元素都有引号(以及u
如果是 Unicode)。
乍一看这可能看起来很奇怪,但这是一个有意的设计决定,一旦你习惯了它就有意义了。打印出来会很含糊[foo, bar, baz]
——这是一个由三个字符串组成的列表,还是一个由两个字符串组成的列表,其中一个字符串中间有一个逗号?但更重要的是,有一个清单already不管你如何打印出来,这都不是一个用户友好的事情。My hobbies are [Painting, Stargazing]
看起来会像一样丑陋My hobbies are ['Painting', 'Stargazing']
。当您想要向最终用户显示列表时,您总是希望以某种有意义的方式显式地格式化它。
通常,您想要的就这么简单:
>>> print 'Hobbies:', ', '.join(hobbies)
Hobbies: Painting, Stargazing
或者,对于 Unicode 字符串:
>>> print u'Hobbies:', u', '.join(hobbies)
Hobbies: Painting, Stargazing