8

'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

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

Enter a hobby: Painting
Enter a hobby: Stargazing
Enter a hobby: Reading
[u'Painting', u'Stargazing', u'Reading']
None

列表中每个元素之前的那些“u”是从哪里来的?

4

4 回答 4

13

我认为您实际上对此感到惊讶的是,打印单个字符串与打印字符串列表的作用不同——无论它们是否是 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 字符串,它们是Paintingu'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
于 2013-10-04T00:25:52.147 回答
7

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

于 2013-10-03T23:35:29.473 回答
6

您不是在打印字符串,而是在打印包含字符串的列表的表示形式。

for hobby in hobbies:
  print hobby
于 2013-10-03T23:35:35.680 回答
0

如果要将 unicode 转换为字符串。您可以简单地使用 str(unicodedString) 或 unicode(normalString) 进行其他方式转换

代码

hobbies = []

#prompt user three times for hobbies
for i in range(3):
    hobby = raw_input('Enter a hobby:')
    # converting the normal string to unicode
    hobbies.append(unicode(hobby))

# Printing the unicoded string
print("Unicoded string")
print(hobbies)
hobbies = [str(items) for items in hobbies]

# Printing the converted string
print("Normal string from unicoded string")
print(hobbies)

输出

Enter a hobby:test1
Enter a hobby:Test2
Enter a hobby:Test3

Unicoded string
[u'test1', u'Test2', u'Test3']

Normal string from unicoded string
['test1', 'Test2', 'Test3']
于 2017-07-27T15:03:40.847 回答