2012-02-03 33 views

回答

14
>>> '[[0]*2]*2' 
'[[0]*2]*2' 

>>> `[[0]*2]*2` 
'[[0, 0], [0, 0]]' 

第一個是文本,所述第二評估立即成數據結構,並返回其文本表示'[[0, 0], [0, 0]]'

[[0]*2]*2的問題在於,它評估的是對同一對象的引用列表。這就是爲什麼你得到[[1,0],[1,0]]而不是[[1,0],[0,0]]

+6

值得注意的是,這種反引號語法已從Python 3中刪除。請使用'repr()'代替。 – 2012-02-03 10:03:39

+2

這是impornat提及「backquotes」在Python中根本沒有引號 - 它們相當於對「repr」的調用 - 但是裏面的任何內容都是執行的「實時代碼」。是的,這很奇怪,並且已在新版本中刪除。應該避免使用反引號。 – jsbueno 2012-02-03 11:33:11

5
eval('[[0]*2]*2') 

這創建了評估Python代碼[[0]*2]*2的結果。將列表乘以列表,其中包含對原始對象的多個引用。結果列表是[x, x],其中每個x是一個看起來像[0, 0]的列表。修改其中一個子列表會修改它們,因爲它們是同一個對象。

eval(`[[0]*2]*2`) 

這產生上述(經由內[[0]*2]*2),然後創建它的字符串表示(因爲反引號的),這是[[0, 0], [0, 0]],然後創建該評價的結果作爲Python代碼。這一次,這兩個子列表是單獨的列表,每個列表看起來像[0, 0],但是是單獨的對象。修改其中一個對另一個沒有影響,因爲它們不是同一個對象。

順便說一句,使用``多年來一直非常沮喪。你實際上不能引用東西``。它用於創建一些Python對象的字符串表示。

`hi mom` 

是語法錯誤。

相關問題