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

2 投票
5 回答
1213 浏览
提问于 2025-04-15 16:55

我想在Python中创建一个三维的NNN列表,像这样:

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 个回答

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]
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
5

问题在于 * n 只是对列表进行了浅拷贝,也就是说它只是复制了列表的引用,而不是复制列表里面的内容。解决这个问题的方法是使用嵌套循环,或者可以尝试使用 numpy 这个库。

撰写回答