我有一个问题,如何创建一个子列表(我希望这是正确使用的术语)从给定的列表,而不是复制.
切片似乎可以创建子列表,但是可以通过复制来实现.这是一个例子.
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].
我四处搜索并没有找到太多帮助(也许我没有使用正确的关键字).谢谢!
编辑:
谢谢大家的意见和答案!这是我学到的.
这是与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)
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帖子.
| 归档时间: |
|
| 查看次数: |
3069 次 |
| 最近记录: |