a=eval('[[0]*2]*2')
a[0][0]=1
a
將成爲[[1,0],[1,0]]
如果我寫
a=eval(`[[0]*2]*2`)
a[0][0]=1
a
將成爲[[1,0],[0,0]]
誰能告訴我爲什麼?
a=eval('[[0]*2]*2')
a[0][0]=1
a
將成爲[[1,0],[1,0]]
如果我寫
a=eval(`[[0]*2]*2`)
a[0][0]=1
a
將成爲[[1,0],[0,0]]
誰能告訴我爲什麼?
>>> '[[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]]
。
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`
是語法錯誤。
值得注意的是,這種反引號語法已從Python 3中刪除。請使用'repr()'代替。 – 2012-02-03 10:03:39
這是impornat提及「backquotes」在Python中根本沒有引號 - 它們相當於對「repr」的調用 - 但是裏面的任何內容都是執行的「實時代碼」。是的,這很奇怪,並且已在新版本中刪除。應該避免使用反引號。 – jsbueno 2012-02-03 11:33:11