小编Eth*_*han的帖子

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 …
Run Code Online (Sandbox Code Playgroud)

python

9
推荐指数
1
解决办法
3069
查看次数

带有ArrayList <List <Integer >>的Java OutOfMemoryError

我想用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>> …

java arraylist out-of-memory

3
推荐指数
1
解决办法
279
查看次数

标签 统计

arraylist ×1

java ×1

out-of-memory ×1

python ×1