我有一个关于如何从给定列表创建子列表(我希望这是正确的术语来使用)而不复制的问题。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