2014-02-14 97 views
1

以下代碼:Python:列表被覆蓋。但爲什麼?

file_path = 'some_path/data.txt' 
exp = loadtxt(file_path) 

signal_exp = [] 
signal_exp.append(exp[1, :]) 

signal_exp_new = [] 
signal_exp_new.append(signal_exp[0]) 

signal_exp_new[0][0:800] = 0.0 

將導致signal_exp在第一元件800覆蓋beeing以及signal_exp_new。我找到了解決辦法,但我不明白爲什麼下一個(至少我)按預期工作:

file_path = 'some_path/data.txt' 
exp = loadtxt(file_path) 

signal_exp = [] 
signal_exp.append(exp[0, :].tolist()) 

signal_exp_new = [] 
signal_exp_new.append(signal_exp[0][:]) 

for l in range(800): 
    signal_exp_new[0][l] = 0.0 

誰能給我一個解釋,爲什麼在後者的情況下,不覆蓋原來的名單,但在第一個案例是?

+0

因爲'[:]'創建一個複製完整列表的分片。 – njzk2

回答

3

NumPy數組切片和Python列表切片的工作方式不同。在Python列表上切片返回列表的淺表副本,而在NumPy數組上它只是返回數組項的視圖。

從NumPy的docs

注意陣列片不要複製內部陣列中的數據,但也 產生原始數據的新觀點。

所以,在你的第一個解決方案,您可以使用.copy來獲取數組的一個副本:

signal_exp_new.append(signal_exp[0].copy()) 
1

操作[:]返回序列的片。切分列表的一部分:創建一個新列表,並將原始列表的一部分複製到這個新列表中。

沒有[:],沒有新的列表被創建。 signal_exp [0]和signal_exp_new [0]引用相同的列表。

http://henry.precheur.org/python/copy_list

1

在你使用指針arithmethic第一個片段。這意味着您不會將signal_exp[0]中的條目複製到新列表中,但它會使用相同的對象並將其「附着」到新變量中 - 或者在本例中將其附加到列表元素。 [:]創建列表的副本(但只有一個元素深)。