2012-05-16 93 views
3

我是新手到Python,到處都是我讀到列表方法我看到一件事Python列表(切片法)

切片方法返回一個「新」列表

這到底是怎麼通過的意思「新」列表,爲什麼更改原始列表更快?

是否真的很重要,如果python操縱原始列表,我的意思是我無法使用它。

+1

順便說一句,如果你想檢查你是否仍然有相同的對象在Python中,你可以隨時與[id()](http://docs.python.org/library/functions.html #id) – snies

回答

2

我希望這有助於解釋這意味着通過使一個新的列表:

>>> lista = [1, 2, 3, 4]   
>>> listb = lista 
>>> print lista 
[1, 2, 3, 4] 
>>> print listb 
[1, 2, 3, 4] 
>>> lista[0] = 3 
>>> print listb 
[3, 2, 3, 4] 
>>> listc = lista[:] 
>>> print listc 
[3, 2, 3, 4] 
>>> lista[0] = 1 
>>> print listc 
[3, 2, 3, 4] 

在做listb = lista你是不是做一個新的列表,你這是一個額外的參考同一列表。這通過將lista中的第一個元素更改爲lista[0] = 3來顯示,這也會更改listb中的第一個元素。但是,當將lista切片到listc = lista[:]的listc中時,您正在複製這些值。當lista[0] = 1改變LISTA的第一要素回1,l​​istc的第一要素仍是3

對於速度我希望切片要慢一些,但這應該不是考慮一個用於哪些。正如我已經表明,他們都有一個非常不同的含義,這取決於你將如何處理列表,而不是速度(這通常是。有時候速度可能很重要)。

3

隨着名單,你既可以做:

1)創建一個新的列表(原來是原封不動):

In [1]: l = [1, 2, 3, 4, 5] 

In [2]: l[:3] 
Out[2]: [1, 2, 3] 

In [3]: l 
Out[3]: [1, 2, 3, 4, 5] 

2)修改列表就地:

In [6]: del l[3:] 

In [7]: l 
Out[7]: [1, 2, 3] 

In [8]: l.append(15) 

In [9]: l 
Out[9]: [1, 2, 3, 15] 

這取決於你選擇哪種方式對你的問題更有意義。

與列表不同,元組是不可變的,這意味着你可以對它們進行切片,但是你不能對它們進行修改。

+0

因此,當我使用append方法時會發生什麼?原始列表被操縱或創建一個新列表,現在我的變量名稱指向新的列表? –

+0

@KartikAnand:'append()'就地修改列表。 – NPE

+0

所以追加功能不會返回任何東西..我在這裏? –

0
  1. 「新」表示您切片的部分列表的淺表副本。

  2. 這取決於你正在嘗試做什麼。對於您的特定實現,您可能不關心原始數據,但我相信您可以想出您想要在不修改原始數據的情況下處理數據子集的場景(儘管請記住它只是一個淺層複製,因此有很多情況下,您將在片段上工作時修改原始數據和切片中的數據)。另外,它不是更快;實際上,它實際上比較慢,因爲系統需要分配內存並構建新的對象。增益不是速度,而是功能。

0

當一個函數/方法創建一個新的列表,這意味着你的腳本有消耗內存的雙量有少許(或不那麼一點)開銷,同時創造了舊錶的副本。

如果列表非常大,腳本的性能可能會非常快地下降。這就是爲什麼當您擁有大量數據時,首選就地更改列表。