在Python中打印一个包含中文字符的列表

5

我的代码看起来像这样:

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

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

在Eclipse控制台输出的结果非常奇怪:
['asdf', '\xe4\xb8\xad\xe6\x96\x87']
['\xe4\xb8\xad\xe6\x96\x87']
中文

我第一个问题是:为什么最后一行得到了正确的输出,而其他行没有?

我的第二个问题是:如何更正错误的代码(使它们输出真正的字符,而不是以“x”开头的代码)?

谢谢大家!!

2个回答

6
为什么最后一行输出正确,其他行却没有?
当你使用“print foo”时,输出的内容是“str(foo)”。
然而,如果“foo”是一个列表,“str(foo)”就会对每个元素“bar”使用“repr(bar)”,而不是“str(bar)”。
字符串的“str”是字符串本身;字符串的“repr”是放在引号内并转义的字符串。
如何修正错误?
如果你想打印出一个列表中每个元素的“str”,你需要明确指定。例如:
print '[' + ', '.join(["asdf", "中文"]) + ']'

已有零散的提案试图改变它的行为,使得在序列上使用 str 时会调用其成员的 str 方法。但被拒绝的提案是 PEP 3140。这个来自2009年的帖子解释了拒绝它的设计原理。

主要是为了避免这些不同的输出:

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

或者,用Ned Batchelder的话来说:repr总是面向极客的;str尽可能地面向人类,但打印带有方括号和逗号的列表已经是面向极客的了。

1
此外,查看这个非常详细的解释,介绍了str和repr之间的区别:https://dev59.com/KHM_5IYBdhLWcg3wTRPL - alejandro
但是在Python2中, >>> str('中文') 将返回 '\xe4\xb8\xad\xe6\x96\x87' 而不是 "中文" 如同 print("中文") - Cloud
@SiminJie 不,str('中文') 返回 '中文',因为它已经是一个 str,所以调用 str 对它没有任何影响。如果你的源编码是 UTF-8,那么它恰好是与 '\xe4\xb8\xad\xe6\x96\x87' 相同的字符串,但它永远不会以反斜杠转义的形式 _打印出来_。但是,如果你在交互式解释器中评估一个值,解释器会显示该值的 repr,而不是该值本身。 - abarnert

1
第一个和第二个使用字符串的__repr__,最后一个使用__str__方法。
你可以使用。
print ", ".join(["asdf", "中文"])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接