Распечатайте список, содержащий китайские иероглифы в Python

Мой код выглядит так:

# -*- coding: utf-8 -*-

print ["asdf", "中文"]
print ["中文"]
print "中文"

Вывод в консоли Eclipse очень странный:

['asdf', '\xe4\xb8\xad\xe6\x96\x87']
['\xe4\xb8\xad\xe6\x96\x87']
中文

Мой первый вопрос: почему последняя строка получила правильный вывод, а остальные нет?

И мой второй вопрос: как мне исправить неправильные (чтобы они выводили настоящие символы вместо кода, начинающегося с "x") ?

Спасибо вам, ребята!!


person Community    schedule 10.07.2013    source источник


Ответы (2)


почему последняя строка получила правильный вывод, а остальные нет?

Когда вы print foo, распечатывается str(foo).

Однако, если foo является list, str(foo) использует repr(bar) для каждого элемента bar, а не str(bar).

str строки — это сама строка; repr строки - это строка внутри кавычек, экранированная.

как исправить неправильные

Если вы хотите напечатать str каждого элемента в list, вы должны сделать это явно. Например:

print '[' + ', '.join(["asdf", "中文"]) + ']'

Были спорадические предложения изменить это поведение, поэтому str в последовательности вызывает str ее членов. PEP 3140 — отклоненное предложение. В этой ветке 2009 года поясняется причина отказа от нее.

Но в первую очередь это либо так, что они не печатают одно и то же:

a = 'foo, bar'
b = 'foo'
c = 'bar'
print [a]
print [b, c]

Или, перефразируя Неда Батчелдера: repr всегда для гиков; str для людей, когда это возможно, но печатать списки с их скобками и запятыми уже для гиков.

person abarnert    schedule 10.07.2013
comment
Кроме того, ознакомьтесь с этим очень подробным объяснением различий между str и repr: stackoverflow.com/questions/1436703/ - person alejandro; 10.07.2013
comment
Но в Python2 >>> str('中文') вернет '\xe4\xb8\xad\xe6\x96\x87', но не "中文", как print("中文"). - person Simin Jie; 03.04.2018
comment
@SiminJie Нет, str('中文') возвращает '中文', потому что это уже str, поэтому вызов str ничего не дает. Это точно такая же строка, как '\xe4\xb8\xad\xe6\x96\x87', если исходная кодировка UTF-8, но она никогда не будет печатать с обратной косой чертой. Но если вы просто оцениваете значение в интерактивном интерпретаторе, интерпретатор отображает repr этого значения, а не само значение. - person abarnert; 03.04.2018

Первые два используют __repr__ строк, последний использует метод __str__

Вы могли бы использовать

print ", ".join(["asdf", "中文"])
person John La Rooy    schedule 10.07.2013