2013-12-15 89 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將對象轉換爲字節字符串(它正在做顯式轉換,而不是隱式轉換)。