我有一個關於如何從給定列表創建子列表(我希望這是正確的術語來使用)而不復制的問題。Python:創建子列表而不復制
看來,切片可以創建子列表,但它與複製。這是一個例子。
In [1]: a = [1,2,3]
In [2]: id(a)
Out[2]: 4354651128
In [3]: b = a[0:2]
In [4]: b
Out[4]: [1, 2]
In [5]: id(b)
Out[5]: 4354621312
In [6]: id(a[0:2])
Out[6]: 4354620880
請看這裏b和a [0:2]的id雖然不同,但它們的值是相同的。要仔細檢查,更改a中的值,b中的值不會更改。
In [7]: a[1] = 4
In [8]: a
Out[8]: [1, 4, 3]
In [9]: b
Out[9]: [1, 2]
所以要回我的問題,我怎麼可以創建子列表,但沒有複製?我的意思是,當a [1]的值設置爲4時,b將是[1,4]。
我周圍搜索,並沒有找到太多的幫助(也許我沒有使用正確的關鍵字)。謝謝!
編輯:
謝謝大家對您的意見和解答!這是我所學到的。
- 在Python中沒有內置的方式來創建列表視圖(或不創建子列表而不復制)。
- 最簡單的方法是使用numpy數組。
- 雖然numpy的數組數據類型的限制與列表進行比較,它確實爲我的目的(實現沒有多餘的內存快速排序)
這裏是numpy的陣列相同的過程。
In [1]: import numpy as np
In [2]: a = np.arange(1,4)
In [3]: a
Out[3]: array([1, 2, 3])
In [4]: b = a[0:2]
In [5]: b
Out[5]: array([1, 2])
In [6]: id(b)
Out[6]: 4361253952
In [7]: id(a[0:2])
Out[7]: 4361254032
In [8]: a[1] = 4
In [9]: a
Out[9]: array([1, 4, 3])
In [10]: b
Out[10]: array([1, 4])
這種共享的問題是內存泄漏:假設您使用對列表和值a和b的引用來表示切片列表[a:b]。然後,即使切片非常小,它也會阻止列表被垃圾收集,這可能會非常昂貴。但是,當然,您可以使用上述表示法爲「符號」列表切片定義自定義類。 – 2015-02-05 22:07:59
你爲什麼要這樣做? – 2015-02-05 22:47:53
我想你所描述的非常接近'numpy'陣列的觀點。看到[這個SO帖子和答案](http://stackoverflow.com/questions/4370745/view-onto-a-numpy-array)關於這個話題的一些討論。但要注意,與典型的Python列表相比,'numpy'數組對於它們可以包含的數據類型不太靈活,所以它們可能不適合您的用例,具體取決於您希望包含的數據。 – zehnpaard 2015-02-06 01:30:32