我有一个问题,如何创建一个子列表(我希望这是正确使用的术语)从给定的列表,而不是复制.
切片似乎可以创建子列表,但是可以通过复制来实现.这是一个例子.
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 …Run Code Online (Sandbox Code Playgroud) 我想用Java创建一个非常大的图形(有大约1000万条边).我打算List<List<Integer>>描述边缘,内部List<Integer>描述每条边的两个顶点(顶点是整数类型).
下面的代码抛出OutOfMemoryError大约100万条边后面的图形.(为了讨论起见,我简化了边缘的生成方式.)
public static void main(String[] args) {
List<List<Integer>> graph = new ArrayList<List<Integer>>();
for (int i = 0; i < 10000000; i++) {
List<Integer> edge = new ArrayList<Integer>();
// the real edges are more complicated (than from vertex i to vertex i+1)
// this is simplified for the sake of the discussion here
edge.add(i);
edge.add(i+1);
graph.add(edge);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经搜索过了OutOfMemoryError,我已经将Eclipse的初始堆大小增加到2G :( -Xms2g -Xmx4g -Xss2m它被传递给JVM).但这并没有解决问题.
然后我想也许我应该List<Integer> edge通过调用垃圾收集变量,System.gc()以防它的内存没有被清除.那也行不通.
我想也许问题出在List<List<Integer>> …