Python:创建子列表而不复制

Eth*_*han 9 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
Run Code Online (Sandbox Code Playgroud)

在这里看到b的id和[0:2]是不同的,尽管它们的值是相同的.要仔细检查,更改a中的值,b中的值不会更改.

In [7]: a[1] = 4

In [8]: a
Out[8]: [1, 4, 3]

In [9]: b
Out[9]: [1, 2]
Run Code Online (Sandbox Code Playgroud)

所以回到我的问题,如何创建子列表但不复制?我的意思是,当a [1]的值设置为4时,b将为[1,4].

我四处搜索并没有找到太多帮助(也许我没有使用正确的关键字).谢谢!


编辑:

谢谢大家的意见和答案!这是我学到的.

  • Python中没有内置的方法来创建列表视图(或创建子列表而不复制).
  • 最简单的方法是使用numpy数组.
  • 虽然numpy数组与list相比对数据类型有限制,但它确实符合我的目的(实现没有额外内存的quicksort)

这是与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])
Run Code Online (Sandbox Code Playgroud)

zeh*_*ard 5

numpy通过切片返回views而不是数据的副本,数组对象支持创建相互依赖的子列表的这一概念.

更改原始numpy数组将更改从数组创建的视图,并且对任何视图的更改也将反映在原始数组中.特别是对于大型数据集,视图是以不同方式切割数据的好方法,同时节省了内存.

>>> import numpy as np
>>> array1 = np.array([1, 2, 3, 4])
>>> view1 = array1[1:]
>>> view1
array([2, 3, 4])
>>> view1[1] = 5
>>> view1
array([2, 5, 4])
>>> array1
array([1, 2, 5, 4]) # Notice that the change to view1 has been reflected in array1
Run Code Online (Sandbox Code Playgroud)

有关进一步参考,请参阅numpy有关视图文档以及此SO帖子.