我认为您实际上对此感到惊讶的是,打印单个字符串与打印字符串列表的作用不同——无论它们是否是 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
。因此,当您 print 时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