8

印刷されたリストの要素の前に「u」? コードに 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、引用符とエスケープが残ります (さらに、ソース ファイルと端末のエンコーディングが異なる場合は文字化け文字が含まれる可能性がありますが、その部分は忘れてください)。


Python では、すべてのオブジェクトが 2 つの異なる表現を持つことができます: エンド ユーザーにわかりやすい表現strと、プログラマーにわかりやすい表現 ですrepr。バイト文字列の場合、これらの表現はそれぞれPainting'Painting'です。Unicode 文字列の場合はPainting、 とu'Painting'.

printステートメントは を使用するためstr、引用符なしで をprint hobby1出力しPaintingます ( uUnicode の場合は )。

ただし、strリストの は、reprではなく、その各要素の を使用しstrます。したがって、 を印刷するhobbiesと、各要素は引用符で囲まれます ( uUnicode の場合は a)。

最初は奇妙に思えるかもしれませんが、これは意図的な設計上の決定であり、慣れれば理にかなっています。[foo, bar, baz]3 つの文字列のリストですか、それとも 2 つの文字列のリストで、そのうちの 1 つが途中にコンマを持っているのでしょうか? しかし、もっと重要なことに、リストは、どのように印刷しても、ユーザーフレンドリーなものではありません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 に答える