2013-12-15 136 views
2

林不解以下几点:蟒纹的unicode“异常”

>>> 
>>> 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') 

什么是当一个隐式类型转换做了规则,当其不?

+3

不同之处在于是否使用__repr__或__str__。 – Hyperboreus

回答

3

这是一个unicode对象的strrepr之间的差异。 repr旨在给你一个等价的对象,如果你粘贴回Python,所以它包括u; str是为了人类的可读性而设计的,所以它没有。字符串的strrepr是相同的(它们只是相同的字符串)。

这里的相关规则被用于其中的一个是:

  • 在解释器提示提起可变回送其repr
  • print使用str
  • print a,z打印两个物体通过分隔空间 - 它解析为print (a), (z)。它使用
  • print(a, z)str构建并打印包含这两个对象的元组。 print [a,z]的行为相似,只不过它建立并打印列表。在这两种情况下,print都使用容器的str--对于元组和列表都使用其内容的repr
  • print(a, str(z))电话str(z)第一,并把它的结果的元组 - 并让字符串被使用,而不是z的再版中的再版。
+0

哦,我看到,打印不会递归到结构中。谢谢。 [这个弹出来,试图找出我从id3标签vs FLAC诱变得到什么,以及一些'诊断'输出来判断是否得到字符串或unicode] – RFlack

0

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') 
0

Python 2中不执行添加Unicode字符串(它们是unicode类型的)到一个字节字符串(它们是str类型)时除外隐式类型转换(Python 3中不执行隐式类型转换)。 str将对象转换为字节字符串(它正在做显式转换,而不是隐式转换)。