2

我正在尝试在 Python 中创建一个 3 维 N N N 列表,如下所示:

n=3
l = [[[0,]*n]*n]*n

不幸的是,这似乎并没有正确地“克隆”列表,因为我认为它会:

>>> l
[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]
>>> l[0][0][0]=1
>>> l
[[[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]], [[1, 0, 0], [1, 0, 0], [1, 0, 0]]]

我在这里做错了什么?

4

5 回答 5

5

问题是它* n做了一个列表的浅拷贝。一个解决方案是使用嵌套循环,或者尝试使用 numpy 库。

于 2009-12-11T16:14:45.450 回答
4

如果要使用 3-d 矩阵进行数值处理,最好使用 numpy。这很容易:

>>> import numpy
>>> numpy.zeros((3,3,3), dtype=numpy.int)
array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]])
>>> _[0,0,0]
0
于 2009-12-11T21:45:43.577 回答
3

正如其他人所提到的,它使用引用而不是克隆来构建第 2 和第 3 级别。尝试:

>>> n = 3

>>> l = [[[0]*n for _ in xrange(n)] for _ in xrange(n)]

>>> l[0][0][0] = 1

>>> l
[[[1, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]

或者,如果您想少输入一点:

>>> l = [[[0]*n for _ in '.'*n] for _ in '.'*n]
于 2009-12-11T16:18:58.800 回答
2

我必须支持 leonardo-santagada 的建议,此外,创建 N 维数组/列表非常不合 Python,您应该重新考虑如何保存数据并查看它是否不属于更好的类或列表字典(或列表字典)。

于 2009-12-11T21:56:44.460 回答
2

它不是克隆列表。它一遍又一遍地插入对同一个列表的引用。尝试使用一组嵌套的 for 循环创建列表。

于 2009-12-11T16:13:46.407 回答