【问题标题】:python print unicode 'anomaly' [duplicate]python打印unicode'异常'[重复]
【发布时间】:2014-01-02 17:18:08
【问题描述】:

我对以下内容感到困惑:

>>> 
>>> a
'abc'
>>> z
u'xyz'
>>> print a,z
abc xyz
>>> print (a,z)
('abc', u'xyz')
>>> print [a,z]
['abc', u'xyz']
>>> print (a,str(z))
('abc', 'xyz')

隐式类型转换何时完成和何时不完成的规则​​是什么?

【问题讨论】:

  • 区别在于使用的是repr还是str

标签: python unicode


【解决方案1】:

这是 unicode 对象的 strrepr 之间的区别。 repr 旨在在将其粘贴回 Python 时提供等效对象,因此它包含 u; str 是为了人类可读性,所以它不是。字符串的strrepr 是相同的(它们只是相同的字符串)。

此处使用的相关规则是:

  • 在解释器提示中提及变量会回显其repr
  • print 使用 str
  • print a,z 打印由空格分隔的两个对象 - 它解析为 print (a), (z)。它使用两者的str
  • print(a, z) 构建并打印一个包含两个对象的元组。 print [a,z] 的行为类似,只是它构建并打印一个列表。在这两种情况下,print 使用容器的 str - 对于元组和列表都使用其内容的 repr
  • print(a, str(z)) 首先调用 str(z),并将其结果放入元组中 - 因此 该字符串 的 repr 被使用,而不是 z 的 repr。

【讨论】:

  • 哦,我明白了,打印不会递归到结构中。谢谢。 [这在试图弄清楚我从 id3 标签上的诱变剂与 FLAC 得到什么以及一些“诊断”输出来确定我得到的是字符串还是 unicode 时弹出]
【解决方案2】:

print 语句调用 str 获取参数。

>>> a = 'abc'
>>> z = u'xyz'
>>> str(a)
'abc'
>>> str(z)
'xyz'
>>> print a, z
abc xyz
>>> print str(a), str(z)
abc xyz

>>> str((a,z))
"('abc', u'xyz')"
>>> str([a,z])
"['abc', u'xyz']"
>>> print (a,z)
('abc', u'xyz')
>>> print str((a,z))
('abc', u'xyz')

【讨论】:

    【解决方案3】:

    Python 2 不执行隐式类型转换,除非将 Unicode 字符串(属于 unicode 类型)添加到字节字符串(属于 str 类型)(Python 3 不执行隐式类型转换)。 str 将对象转换为字节字符串(它正在进行显式转换, 隐式转换)。

    【讨论】:

      猜你喜欢
      • 2017-04-05
      • 2016-12-20
      • 2018-10-10
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多