在Python中创建N * N * N列表的问题

时间:2009-12-11 16:10:04

标签: python list mutable

我正在尝试在Python中创建一个三维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]]]

我在这里做错了什么?

5 个答案:

答案 0 :(得分:5)

问题是* n执行列表的浅表副本。解决方案是使用嵌套循环,或尝试使用numpy库。

答案 1 :(得分:4)

如果你想用三维矩阵进行数值处理,你最好使用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

答案 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]

答案 3 :(得分:2)

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

答案 4 :(得分:2)

我必须要了解leonardo-santagada建议的内容,另外一点是创建N维数组/列表是非常单一的,你应该重新考虑如何保存数据并查看它是否在类中不是更好或者字典列表(或列表字典)。