我正在從一個csv文件中讀取行的py腳本,操縱它們,並將它們放回。到目前爲止,我有csv列表轉換工作。爲什麼python中的'for'循環改變未引用的列表?
我遇到的問題是當我迭代臨時列表時,for循環會更改所有臨時列表,而不僅僅是我想要的那個。這是我想說的一個簡單的例子。
>>> l = [['hi', 'ho'],['no', 'go']]
>>> t = []
>>> y = []
>>>
>>> for row in l:
... row[0] = '123'
... y.append(row)
... t.append(row)
...
>>> y
[['123', 'ho'], ['123', 'go']]
>>> t
[['123', 'ho'], ['123', 'go']]
所以上面是直截了當的(希望)。 (讓我們假設除了複製列表之外,我還想做其他事情,只是爲了保持簡單)。
但現在這裏是我沒有得到的部分。
>>> z = []
>>> for row in y:
... row[0] = 'xxxx'
... z.append(row)
...
>>> z
[['xxxx', 'ho'], ['xxxx', 'go']]
>>> t
[['xxxx', 'ho'], ['xxxx', 'go']]
>>> y
[['xxxx', 'ho'], ['xxxx', 'go']]
當我要修改的子列表第一部分,並將其保存到一個新的列表「Z」,它會修改列表T中的!
這是怎麼回事? z,y和t指向相同的內存位置?
而且,這裏發生了什麼?:
>>> for rowx in y:
... rowx[0] = 'x55x'
... z.append(rowx)
...
>>> z
[['xxxx', 'ho'], ['x55x', 'go'], ['x55x', 'go'], ['x55x', 'go']]
>>> t
[['xxxx', 'ho'], ['x55x', 'go']]
>>> y
[['xxxx', 'ho'], ['x55x', 'go']]
對上述問題類似,爲什麼y及t得到改變?
在此先感謝!
對於列表的淺表副本,您可以使用'y [:]' – SingleNegationElimination 2010-12-15 23:34:28
謝謝jleedev!雖然[:]回答並解決了我的問題,您的copy.deepcopy解決方案也是如此,這是我在腳本中必須做的事情,因爲淺拷貝是不夠的(顯然)。你解決了我的問題! :) – RaytheonLiszt 2010-12-15 23:49:44
@Raytheon'[:]'slice,一個簡單的'for'循環和一個淺拷貝都具有完全相同的效果。 – 2010-12-15 23:54:19