打印字符串在Python中的字符串之前打印'u'?

7 python printing unicode python-2.x

'u'在打印列表中的元素之前?我没有在我的代码中输入你.

hobbies = []

#prompt user three times for hobbies
for i in range(3):
    hobby = raw_input('Enter a hobby:')
    hobbies.append(hobby)

#print list stored in hobbies
print hobbies
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它打印列表但它的格式如下:

Enter a hobby: Painting
Enter a hobby: Stargazing
Enter a hobby: Reading
[u'Painting', u'Stargazing', u'Reading']
None
Run Code Online (Sandbox Code Playgroud)

那些'你'在列表的每个元素之前来自哪里?

aba*_*ert 12

我认为你真正感到惊讶的是,打印单个字符串与打印字符串列表的方式不同 - 无论它们是否为Unicode都是如此:

>>> hobby1 = u'Dizziness'
>>> hobby2 = u'Vértigo'
>>> hobbies = [hobby1, hobby2]
>>> print hobby1
Dizziness
>>> print hobbies
[u'Dizziness', u'V\xe9rtigo']
Run Code Online (Sandbox Code Playgroud)

即使没有u,你也有这些额外的引用,更不用说反斜杠了.如果你用str字节字符串而不是unicode字符串尝试相同的东西,你仍然会有引号和转义(如果你的源文件和你的终端有不同的编码,你可能会有mojibake字符......但是忘记那部分).


在Python中,每个对象都可以有两种不同的表示形式:最终用户友好的表示形式str,以及程序员友好的表示形式repr.对于字节字符串,这些表示分别是Painting'Painting'.对于Unicode字符串,它们是Paintingu'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
Run Code Online (Sandbox Code Playgroud)

或者,对于Unicode字符串:

>>> print u'Hobbies:', u', '.join(hobbies)
Hobbies: Painting, Stargazing
Run Code Online (Sandbox Code Playgroud)


小智 6

'u'不是字符串的一部分,但表示字符串是unicode字符串.


Ign*_*ams 6

您不打印字符串,而是打印包含字符串的列表的表示.

for hobby in hobbies:
  print hobby
Run Code Online (Sandbox Code Playgroud)