<p>我认为您实际上感到惊讶的是,打印单个字符串与打印字符串列表不同,无论它们是否为Unicode都是这样:</p>
<pre><code>>>> hobby1 = u'Dizziness'
>>> hobby2 = u'Vértigo'
>>> hobbies = [hobby1, hobby2]
>>> print hobby1
Dizziness
>>> print hobbies
[u'Dizziness', u'V\xe9rtigo']
</code></pre>
<p>即使没有<code>u</code>,也有那些额外的引号,更不用说反斜杠转义了。如果使用<code>str</code>字节字符串而不是<code>unicode</code>字符串尝试相同的方法,则仍然会使用引号和转义符(另外,如果源文件和终端的编码不同,则可能会使用mojibake字符……但请忘记这一部分)。</p>
<hr/>
<p>在Python中,每个对象都可以有两种不同的表示:终端用户友好的表示<code>str</code>,以及程序员友好的表示<code>repr</code>。对于字节字符串,这些表示分别是<code>Painting</code>和<code>'Painting'</code>。对于Unicode字符串,它们是<code>Painting</code>和<code>u'Painting'</code>。</p>
<p><code>print</code>语句使用<code>str</code>,因此<code>print hobby1</code>输出<code>Painting</code>,不带引号(或者<code>u</code>,如果是Unicode)。</p>
<p>然而,列表的<code>str</code>使用其每个元素的<code>repr</code>,而不是<code>str</code>。所以,当您打印<code>hobbies</code>时,每个元素周围都有引号(如果是Unicode,则还有一个<code>u</code>)。</p>
<p>一开始这可能看起来很奇怪,但这是一个有意的设计决定,一旦你习惯了它就有意义了。打印出<code>[foo, bar, baz]</code>是一个由三个字符串组成的列表,还是一个由两个字符串组成的列表,其中一个字符串中间有一个逗号?但是,更重要的是,一个列表已经不是一个用户友好的东西,不管你如何打印出来。<code>My hobbies are [Painting, Stargazing]</code>看起来和<code>My hobbies are ['Painting', 'Stargazing']</code>一样难看。当您想向最终用户显示列表时,您总是希望以某种有意义的方式显式地格式化它。</p>
<p>通常,你想要的就是这么简单:</p>
<pre><code>>>> print 'Hobbies:', ', '.join(hobbies)
Hobbies: Painting, Stargazing
</code></pre>
<p>或者,对于Unicode字符串:</p>
<pre><code>>>> print u'Hobbies:', u', '.join(hobbies)
Hobbies: Painting, Stargazing
</code></pre>