我认为您实际上对此感到惊讶的是,打印单个字符串与打印字符串列表的功能不同–无论是否为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
和'Painting'
。对于Unicode字符串,它们是Painting
和u'Painting'
。
该print
语句使用str
,因此print hobby1
打印出Painting
,不带引号(u
如果为Unicode,则为)。
但是,str
列表的使用其repr
每个元素的,而不使用str
。因此,当您打印时hobbies
,每个元素都带有引号(u
如果是Unicode,则带有引号)。
乍一看这很奇怪,但这是一个故意的设计决定,一旦习惯了,这是有道理的。并且打印出来将是不明确的[foo, bar, baz]
-是三个字符串的列表还是两个字符串的列表,其中一个在中间有逗号?但是,更重要的是,无论您如何打印,列表 已经 不是用户友好的事情。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